【发布时间】:2018-05-09 15:33:38
【问题描述】:
在以下所有参考资料中:
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);
【问题讨论】:
-
(::open)看起来更像是带有不必要括号的 C++,而不是 C。 -
对我来说,它看起来不像
O_NONBLOCK中的任何一个。第二个明确清除它。 -
非阻塞 IO 的使用相当广泛,并且已经使用了很长时间。与其假设它不像记录的那样工作,您可能应该得出结论说您没有(正确地)使用它。
-
该站点man7.org/linux/man-pages/man2/open.2.html 说:“O_NONBLOCK 或 O_NDELAY:.....请注意,此标志对常规文件无效 ....”
-
除此之外,无论非阻塞模式如何,
read()将返回 0,如果这是您请求的字节数,或者当前文件偏移量位于或超过文件末尾。