Unix/Linux编程:非阻塞IO

在打开文件时指定O_NONBLOCK标志,目的有二

  • 如果open()调用未能立即打开文件,则返回错误,而非陷入阻塞。有一种情况属于例外,调用open()操作FIFO可能会陷入阻塞
  • 调用 open()成功后,后续的 I/O 操作也是非阻塞的。若 I/O 系统调用未能立即完成,则可能会只传输部分数据,或者系统调用失败,并返回 EAGAIN 或 EWOULDBLOCK 错误。具体返回何种错误将依赖于系统调用。Linux 系统与许多 UNIX 实现一样,将两个错误常量视为同义。

管道、FIFO、套接字、设备(比如终端、伪终端)都支持非阻塞模式(因为无法通过open()来获取管道和套接字的文件描述符,所以要启用非阻塞标志,就必须使用fcntl的F_SETFL命令)。

另外,由于内核缓存区保证了普通文件IO不会陷入阻塞,因此打开普通文件时一般会忽略O_NONBLOCK标志。但是,当使用强制文件锁时,O_NONBLOCK标志对普通文件也是起作用的。

历史上,派生自 System V 的系统提供有 O_NDELAY 标志,语义上类似于 O_ NONBLOCK标志。二者主要的区别在于:

  • 在 System V 系统中,若非阻塞的 write()调用未能完成写操作,或者非阻塞的 read()调用无输入数据可读时,则两个调用将返回 0。这对于 read()调用来说会有问题,因为程序将无法区分返回 0 的 read()到底是没有可用的输入数据,还是遇到了文件结尾
  • 故而 POSIX.1 标准在初版中引入了 O_NONBLOCLK 标志。有些UNIX 实现一直还在支持旧语义的 O_NDELAY 标志。Linux 系统虽然也定义了 O_NDELAY常量,但其与 O_NONBLOCK 标志同义。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值