0

我使用 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)。

4

2 回答 2

2

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

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

于 2013-01-22T02:39:39.217 回答
1

尝试删除 O_NONBLOCK

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

于 2013-06-19T07:34:24.927 回答