了解ipc通信的linux管道生命线
Posted
技术标签:
【中文标题】了解ipc通信的linux管道生命线【英文标题】:Understanding the lifeline of linux pipe for ipc communication 【发布时间】:2014-11-29 14:42:38 【问题描述】:我想了解管道的使用寿命? http://linux.die.net/man/2/pipe
-
如果发送方或接收方死亡/退出,管道中的数据是否仍然有效?
如果接收器不存在,是否可以创建管道? (即尚未分叉)?
我需要将数据从发送方发送到接收方。但是,接收者可能还没有被分叉,并且可能在大约(发送者之后 1~2 秒)处于活动状态。它们共享父进程,但接收者可能会在发送者之后的某个时间点被分叉,反之亦然。
发件人也有可能随时完成处理并退出。 我正在尝试查看使用管道而不是共享内存队列是否对我有用。
【问题讨论】:
【参考方案1】:必须在分叉之前创建管道。在分叉之后,每个进程都使用读端或写端。最好在分叉后立即关闭管道未使用的一端。
如果写入过程退出,读取器可以read
管道中的所有剩余数据,但随后的read
系统调用返回读取0字节,这就是你知道它结束的方式。如果写入过程仍然保持管道打开但没有向其中写入任何内容,read
会阻塞直到字节可用。
如果写入过程已经将大量数据写入管道并退出,数据仍然可供阅读器使用。
如果读取进程退出,写入进程会被 SIGPIPE 信号终止。它可以选择以不同的方式处理信号,但默认情况下会被终止。
所以管道可能会在作者中存活下来,但不是读者。概念证明(cső 是匈牙利语的管道):
#include <unistd.h>
int main(void)
int cso[2];
pipe(cso);
if (fork() == 0)
close(cso[0]);
write(cso[1], "cso\n", 4);
return 0;
close(cso[1]);
sleep(2);
if (fork() == 0)
char line[4];
read(cso[0], line, 4);
write(1, line, 4);
return 0;
close(cso[0]);
return 0;
【讨论】:
“写”和“读”过程是如何定义的?我猜测取决于当前进程中管道文件描述符的哪一端是“打开的”? 没错。通常你在分叉后立即关闭管道的未使用端。 明白了,所以如果我在发送者和阅读者中都打开它们,它应该可以解决问题吗? IE。如果他们中的任何一个死了,我都不会丢失数据。如果阅读器还没有被分叉,我也应该能够在管道上发送数据? “不松散数据”是什么意思?!?!?!?! 我已经对问题进行了编辑,我正在尝试将数据从发送方发送到接收方,两者都是独立的进程,接收方可以在发送方之后启动一点,他们共享父进程,但在父进程的不同点被分叉。以上是关于了解ipc通信的linux管道生命线的主要内容,如果未能解决你的问题,请参考以下文章