我经历了各种不同的名为管道客户端/服务器实现的Linux,但其中大多数在读取/写入时使用阻止默认值。
因为我已经在使用poll()来检查其他标志,所以也可以通过poll()检查传入的FIFO数据是一个好主意…
经过所有研究,我认为以O_RDWR模式打开管道是防止在没有任何编写者打开管道的情况下无限期发生EOF事件的唯一方法。
这样,管道的两端都关闭了,其他客户端也可以打开可写端。作为回应,我将使用单独的管道…
我的问题是,尽管我发现了一些使用O_RDWR标志的示例,但open()联机帮助页将该标志描述为在分配给FIFO时未定义。(http://linux.die.net/man/3/open)
但是如何在没有O_RDWR的管道上使用poll()?您认为“ O_RDWR”是打开管道的合法方法吗???
首先,一些预备:
使用O_NONBLOCK和poll()是常见做法-并非相反。要顺利进行,您需要确保处理所有poll()和read()正确的返回状态:
O_NONBLOCK
poll()
read()
read()``0
POLLHUP
0
O_RDONLY | O_NONBLOCK
POLLIN
-1
errno == EAGAIN
errno == EINTR
现在,对于Linux:
如果您使用来打开阅读侧O_RDONLY,则:
O_RDONLY
open()
alarm()
如果您使用来打开阅读侧O_RDONLY | O_NONBLOCK,则:
(特定于Linux :)如果您在阅读方面打开O_RDWR,则:
O_RDWR
(特定于Linux :)如果您在阅读方面打开O_RDWR | O_NONBLOCK,则:
O_RDWR | O_NONBLOCK
如您所知,O_RDWR与管道一起使用不是POSIX或其他标准。
然而,由于这个问题似乎来了的时候,在Linux上的最佳途径,使“弹性命名管道”的生存,即使一方关闭,并不会引起POLLHUPrevents中或回报0的read(),就是用O_RDWR | O_NONBLOCK。
我看到了在Linux上处理命名管道的三种主要方法:
(便携式。)不使用poll(),并且使用单个管道:
open(pipe, O_RDONLY);
read() == -1
read() == 0
(可移植。)使用poll(),并期望管道(即使是命名管道)仅打开一次,并且一旦关闭,则读取器和写入器都必须重新打开它们,从而建立新的管道:
open(pipe, O_RDONLY | O_NONBLOCK);
(不可移植,特定于Linux。)使用poll(),并期望命名管道永远不会终止,并且可以多次连接和断开连接:
open(pipe, O_RDWR | O_NONBLOCK);