首先,一些预备:
使用O_NONBLOCK
和poll()
是常见做法-并非相反。要顺利进行,您需要确保处理所有poll()
和read()
正确的返回状态:
现在,对于Linux:
如果您使用来打开阅读侧O_RDONLY
,则:
如果您使用来打开阅读侧O_RDONLY | O_NONBLOCK
,则:
(特定于Linux :)如果您在阅读方面打开O_RDWR
,则:
(特定于Linux :)如果您在阅读方面打开O_RDWR | O_NONBLOCK
,则:
如您所知,O_RDWR
与管道一起使用不是POSIX或其他标准。
然而,由于这个问题似乎来了的时候,在Linux上的最佳途径,使“弹性命名管道”的生存,即使一方关闭,并不会引起POLLHUP
revents中或回报0
的read()
,就是用O_RDWR | O_NONBLOCK
。
我看到了在Linux上处理命名管道的三种主要方法:
(便携式。)不使用poll()
,并且使用单个管道:
(可移植。)使用poll()
,并期望管道(即使是命名管道)仅打开一次,并且一旦关闭,则读取器和写入器都必须重新打开它们,从而建立新的管道:
(不可移植,特定于Linux。)使用poll()
,并期望命名管道永远不会终止,并且可以多次连接和断开连接: