在以下所有参考文献中:
http://pubs.opengroup.org/onlinepubs/9699919799/
https://linux.die.net/man/3/read
它说:
尝试读取文件(管道或FIFO除外)时 支持非阻塞读取,并且当前没有可用的数据:
如果设置了O_NONBLOCK,则read()将返回-1并将errno设置为 [EAGAIN]。
如果O_NONBLOCK清零,则read()将阻塞调用线程,直到 一些数据可用。
如果存在某些数据,则使用O_NONBLOCK标志无效 可用。
但谁真的尝试过呢?正如我测试的那样,以上所有情况都会让read()返回0。
无论我是这样设置的,O_NONBLOCK似乎都无法正常工作:
int flags = O_RDONLY;
int mode = S_IRGRP|S_IROTH|S_IRUSR;
int _pbfd = (::open)("123",flags,mode);
或者这样:
int _pbfd = (::open)("123",flags,mode);
int saved_flags = fcntl(_pbfd, F_GETFL);
fcntl(_pbfd, F_SETFL, saved_flags & ~O_NONBLOCK);
答案 0 :(得分:1)
适用的the POSIX read()
specification的关键部分是粗体:
尝试读取文件(管道或FIFO除外)时 支持非阻塞读取,目前没有可用的数据:
如果设置了
O_NONBLOCK
,read()
将返回-1
并将errno
设置为[EAGAIN]
。如果
O_NONBLOCK
已清除,read()
将阻止调用线程,直到某些数据可用。如果有一些数据可用,则
O_NONBLOCK
标志的使用无效。
必须设计和编写底层文件系统以支持非阻塞读取,并且大多数文件系统不会对文件执行此操作。
不可能知道为什么文件系统开发人员没有编写许多支持O_NONBLOCK
的文件系统(如果有的话......),但这可能是因为它对文件没用。文件对象具有状态 - 文件系统知道是否有数据可用,并且没有外部依赖性,某些数据可能突然以不影响文件状态的方式出现。
虽然“你读过整个文件”不同于“管道中没有任何内容(尚未)”,但返回给调用者的信息并没有那么大的区别。