c中的命名管道

Posted

技术标签:

【中文标题】c中的命名管道【英文标题】:Named pipes in c 【发布时间】:2010-11-14 21:29:30 【问题描述】:

我正在尝试在 C 中使用命名管道,但遇到了一些困难。就匿名管道而言,我只是使用 r/w 描述符创建管道,然后每次我想进行读取或写入时关闭另一端。这很容易做到,因为我每次都可以打开()和关闭()另一端。

对于命名管道,我有点困惑,我找到了创建命名管道的指令mkfifo(),但不明白如何正确读取和写入它。

谢谢

【问题讨论】:

您的问题不清楚。 open 从未与普通(匿名)管道一起使用,所以我想知道你是否正在做你认为你正在做的事情。 您可能会忽略 fifo 需要在两端打开一个写入和另一个读取的点。 fifo 上的任何读/写调用都会阻塞。手册页在这里linux.die.net/man/3/mkfifo。否则你不是在问问题,只是陈述你的问题。你写了什么代码,是什么造成了你的困惑? 阅读Beej's Guide to Unix IPC。 对于匿名管道,我首先使用 pipe() 函数创建它们,然后让一个进程读取和一个写入管道,但它必须先关闭另一端。它似乎工作正常,并且基于tldp.org/LDP/lpg/node11.html 的示例 【参考方案1】:

在使用mkfifo() 创建管道后(过去可以在任何时候完成 - 命名管道存在于文件系统中,直到它们被取消链接),读取端使用open("/path/to/pipe", O_RDONLY) 和写作方用open("/path/to/pipe", O_WRONLY)打开它。

之后它可以像匿名管道一样使用。

【讨论】:

【参考方案2】:

没什么大不了的。使用 mkfifo 制作管道,然后让您的进程像任何文件一样对其进行读写。它也不是 C 特定的。你可以这样做:

mkfifo testfifo

猫 testfifo

然后在另一个窗口中

echo "hello, world" > testfifo

【讨论】:

【参考方案3】:

我认为你应该只使用管道,因为无论每个进程花费多少时间,它们都会处理不同进程之间的数据传输

【讨论】:

以上是关于c中的命名管道的主要内容,如果未能解决你的问题,请参考以下文章

命名管道中的 C# 死锁

c++ 和 php 中的命名管道

无法使用 C 中的命名管道与 shell 脚本通信

带有命名管道的 C 中的 IPC

无法在 Windows 7 中的命名管道内创建进程

使用命名管道向 ffmpeg 提供输入