我使用 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 上测试过)。如此处所述,在 fifo 上打开多个读取器/写入器是完全有效的。
我将使用它来复制 WinAPI 的 OpenEvent 功能,该功能需要由单独的项目使用。
编辑:在 Debian 和 Ubuntu 上对此进行了测试——两者都符合 POSIX 并允许多个编写者(因此上面的代码没有出现任何问题)。Cygwin 的实现被破坏(即不符合 POSIX)。