这是我前一个问题的从头开始编写的。我真正需要实现的是:将来父工作能够关闭管道的一端,以便孙子(守护程序)接收 SIGPIPE 即可。当我使用1个解决方案时,它就像一个魅力(但这是在任何分叉之前)。当我使用2个解决方案时,只有一个写生成SIGPIPE。我该如何检查?通过发出:strace -f ./a.out 2>& 1 | grep PIPE
#include <sys/wait.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
void child_become_daemon( int pfd[][2], int id )
{
int pid = fork();
if( pid == 0 )
{
dup2( pfd[id][1], 1 );
close( pfd[id][0] );
sleep( 5 ); //this is to be sure that opposite end is already closed
write( 1, "child", strlen( "child" ) );
}
if( pid > 0 )
{
exit( 0 );
}
}
int main()
{
int pid;
int numKids = 5;
int procNum;
int pfd[numKids][2];
for( int i = 0; i < numKids; ++i )
{
pipe( pfd[ i ] );
//close( pfd[i][0] );//1 all killed - perfect
}
for( procNum = 0; procNum < numKids; procNum++ ) {
pid = fork();
if( pid == 0 ) {
break;
}
}
if( pid == 0 ) {
printf( "I'm child %d\n", procNum );
child_become_daemon( pfd, procNum );
}
else {
for( int i = 0; i < numKids; ++i )
{
printf( "closing %d\n", i );
close( pfd[i][0] );//2 why only one will get killed
close( pfd[i][1] );
}
char buf[124] = { 0 };
for( int i = 0; i < numKids; ++i )
{
read( pfd[i][0], buf, 124 );
printf( "buf: %s\n", buf );
}
int p, status;
while ((p = wait(&status)) != -1)
fprintf(stderr, "p %d exits with %d\n", p, WEXITSTATUS(status));
}
return 0;
}
答案 0 :(得分:0)
孙子继承了所有5个管道,因此每个管道都有其他4个管道可供读取,因此没有SIGPIPE。如果有一个“不幸”的时间,最后一个活着可能会得到一个SIGPIPE,因为其余的都没有了。
[编辑] 你也无法真正了解,因为如果他们的父母已经去世,你就不能等待孙子进程。并且你没有在孙子孙女中捕捉到SIGPIPE。