我使用 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)。
最佳答案
管道只有一个读取进程和写入进程。在 POSIX 中,管道是单向的。
改用套接字文件。它是全双工的,允许多进程通信。
关于c - FIFO 上的多个读取器/写入器(命名管道),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14450547/