了解linuxpipe道ipc通信的生命线

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

  1. 如果发送者或接收者死亡/退出,pipe道中的数据是否保持活动状态?
  2. 如果接收器不存在,是否可以创buildpipe道? (即还没有分叉)?

我需要从发件人发送数据到接收者。 但是,接收器可能还没有被分叉,并且可能在发送者之后的1〜2秒内被激活。 他们共享父进程,但接收者可能会在发送者之后的某个时刻被分叉,反之亦然。

发件人也可以随时完成处理并退出。 我试图看看是否使用pipe道而不是共享内存队列将为我工作。

管道必须在叉子之前创建。 在fork之后,每个进程使用read或write结束。 在叉子后立即关闭管道未使用的一端是最好的。

如果写入进程退出,读取器可以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; }