我想了解一根管子的寿命?http://linux.die.net/man/2/pipe
我需要把数据从发送者发送到接收方。但是,接收方可能还没有被分叉,并且可能在发送方之后1~2秒左右处于活动状态。它们共享父进程,但接收方可能在发送方之后的某个时候被分叉,反之亦然。
此外,发送方也可能在任何时候完成处理和退出。我试图看看使用管道的队列而不是共享内存队列是否对我有用。
发布于 2014-11-29 14:52:16
必须在叉子之前创建管道。在分叉之后,每个进程都使用读或写结束。最好在叉子后立即关闭未使用的管子末端。
如果写入过程退出,读取器可以对管道中的所有剩余数据进行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;
} https://stackoverflow.com/questions/27203463
复制相似问题