我想了解管道的使用寿命? http://linux.die.net/man/2/pipe
我需要将数据从发件人发送到接收者。但是,接收器可能尚未分叉,并且可能是活动的(发送者后1~2秒)。它们共享父进程,但接收方可能在发送方之后的某个时刻分叉,反之亦然。
发件人也可以随时完成处理和退出。 我试图查看使用管道而不是共享内存队列是否适用于我。
答案 0 :(得分:1)
管道必须在前叉之前创建。在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;
}