gpt4 book ai didi

linux - 理解ipc通信的linux管道生命线

转载 作者:太空狗 更新时间:2023-10-29 12:31:02 25 4
gpt4 key购买 nike

我想了解管道的生命周期? http://linux.die.net/man/2/pipe

  1. 如果发送方或接收方死亡/退出,管道中的数据是否仍然存在?
  2. 如果接收器不存在,是否可以创建管道? (即尚未 fork )?

我需要将数据从发送方发送到接收方。然而,接收方可能还没有被 fork 出来,并且可能处于事件状态(在发送方之后 1~2 秒)。它们共享父进程,但接收方可能会在发送方之后的某个时刻 fork 掉,反之亦然。

发送方也可以随时完成处理并退出。我正在尝试查看使用管道而不是共享内存队列是否适合我。

最佳答案

管道必须在 fork 之前创建。 fork之后,每个进程要么使用读端,要么使用写端。最好在 fork 后立即关闭管道未使用的一端。

如果写入进程退出,读取器可以读取管道中所有剩余的数据,但是其中后续的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;
}

关于linux - 理解ipc通信的linux管道生命线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27203463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com