FIFO上的多个读写器(命名管道)

时间:2013-01-22 02:18:03

标签: c linux cygwin pipe mkfifo

我使用mkfifo创建了一个命名管道并在其上打开了一个读写器。 然后我继续在同一个fifo上打开第二个读写器,但是打开则返回ENXIO。

std::string n = "/tmp/test";
int err;
err = mkfifo(n.c_str(), 0666);
if (err == -1)
    return NULL;

int pipefd[2];
pipefd[0] = open(n.c_str(), O_RDONLY | O_NONBLOCK);
pipefd[1] = open(n.c_str(), O_WRONLY | O_NONBLOCK);
open(n.c_str(), O_RDONLY | O_NONBLOCK); // fails - ENXIO
open(n.c_str(), O_WDONLY | O_NONBLOCK); // fails - ENXIO

打开管道时是否需要设置任何特定标志以允许多次打开?我已经阅读了文档,但没有找到解释为什么上面的内容会失败(我到目前为止只在Cygwin上测试过)。作为described here,在fifo上打开多个读者/作者是完全有效的。

我将使用它来复制WinAPI的OpenEvent功能,该功能需要由一个单独的项目使用。

编辑:在Debian和Ubuntu上测试过 - 它们都符合POSIX并允许多个编写器(因此上面的代码没有出现任何问题)。 Cygwin的实现被破坏(即不符合POSIX)。

2 个答案:

答案 0 :(得分:2)

管道只能有一个读取器进程和编写器进程。在POSIX中,管道是单向的。

请改用套接字文件。它是全双工的,允许多个进程通信。

答案 1 :(得分:1)

尝试删除O_NONBLOCK

第四次调用open函数时,必须使用O_WRONLY。