【发布时间】:2013-02-09 21:27:19
【问题描述】:
我经历了各种不同的 linux 命名管道客户端/服务器实现,但其中大多数在读/写时使用阻塞默认值。
由于我已经在使用 poll() 来检查其他标志,但通过 poll() 检查传入的 FIFO 数据也是一个好主意...
经过所有研究,我认为以 O_RDWR 模式打开管道是在没有写入器打开管道时防止管道上无限数量的 EOF 事件的唯一方法。
这样管道的两端都是关闭的,其他客户端也可以打开可写端。为了回应,我会使用单独的管道......
我的问题是,虽然我找到了一些使用 O_RDWR 标志的示例,但 open() 联机帮助页将该标志描述为在分配给 FIFO 时未定义。 (http://linux.die.net/man/3/open)
但是,如果没有 O_RDWR,您将如何在管道上使用 poll()?你认为“O_RDWR”是一种合法的打开管道的方式吗???
【问题讨论】:
-
您阅读过
mkfifo(3)和fifo(7)手册页吗?而且您不会获得无限数量的 EOF 事件....您不能在一侧打开它O_RDONLY,在另一侧打开O_WRONLY(然后适当地打开poll)?而fifo(7)明确表示“在阻塞和非阻塞模式下打开 FIFO 进行读写都会成功” -
是的,你是对的 fifo(7) 提到它在 Linux 下是可以的(尽管它不是标准化的 POSIX 行为)。这里的问题是我不能只用“O_RDONLY”打开读取端,用“O_WRONLY”打开写入端,因为默认情况下这会阻塞,这在我的用例中是不允许的。所以虽然我理论上可以用 O_RDONLY | 打开它O_NONBLOCKING 它不会阻塞,但由于可能没有写入器 EOF 事件将在 poll() 上抛出。所以我将不得不使用 O_RDWR 以避免在 open() 上的阻塞行为并能够使用 poll()...