O_NONBLOCK与O_NDELAY有何不同

来源:互联网 发布:php array clear 编辑:程序博客网 时间:2024/04/29 20:38
O_NONBLOCKO_NDELAY所产生的结果都是使I/O变成非搁置模式(non-blocking),在读取不到数据或是写入缓冲区已满会马上return,而不会搁置程序动作,直到有数据或写入完成。

它们的差别在于设立O_NDELAY会使I/O函式马上回传0,但是又衍生出一个问题,因为读取到档案结尾时所回传的也是0,这样无法得知是哪中情况;因此,O_NONBLOCK就产生出来,它在读取不到数据时会回传-1,并且设置errnoEAGAIN

不过需要注意的是,在GNU CO_NDELAY只是为了与BSD的程序兼容,实际上是使用O_NONBLOCK作为宏定义,而且O_NONBLOCK除了在ioctl中使用,还可以在open时设定。

APPENDED:
如果没有数据,那么该调用将被阻塞.处于等待状态,直到有字符输入,
    或者到了规定的时限和出现错误为止,
    通过以下方法,能使read函数立即返回。

    fcntl(fd,F_SETFL,FNDELAY);

    FNDELAY 函数使read函数在端口没月字符存在的情况下,立刻返回0,
    如果要恢复正常(阻塞)状态,可以调用fcntl()函数,不要FNDELAY参数,
    如下所示:
        fcntl(Fd,F_SETFL,0);
    在使用O_NDELAY参数打开串行口后,同样与使用了该函数调用。
    
    fcntl(fd,F_SETFL,0);
原文地址:http://blog.csdn.net/ww2000e/article/details/4497349
原创粉丝点击