c - FIFO 上的多个读取器/写入器(命名管道)

标签 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)。

最佳答案

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

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

关于c - FIFO 上的多个读取器/写入器(命名管道),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14450547/

相关文章:

c - 计算字符串长度的不同方法

linux bash 意外输出 echo

Linux 中的 C++ 创建 2 个文件

cygwin - 如何在 cygwin 中运行应用程序而不阻塞 shell

c - Gtkuimanager 弹出子菜单

无法在 TreeView 中切换复选框

google-chrome - 构建 Chrome : Unable to Rebase Cygwin

windows - 如何使 babun/cygwin 主目录等于 windows 主目录?

c++ - 超声波传感器HC-SR04 + Arduino计算?

c - Linux 和 C 编程 : How can I write utf-8 encoded text to a file?