Chinaunix首页 | 论坛 | 博客
  • 博客访问: 47031
  • 博文数量: 17
  • 博客积分: 425
  • 博客等级: 下士
  • 技术积分: 152
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-04 23:37
文章分类

全部博文(17)

文章存档

2011年(17)

分类: LINUX

2011-07-18 21:06:27

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
阅读(23255) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~