有没有一种方法可以直接将SIGUSR发送给孙子? 例如。我有一些进程树:
0
/ \
1 2
\
3
需要从0
向3
发送信号。
我知道我可以在分叉后保存孩子的pid并将其与kill()
一起使用
pid = fork();
if (pid == 0) {
pid = fork();
if (pid == 0) { /* grandchild */ }
savepid = pid;
}
...
kill(savepid,sig);
但是我必须使用共享内存来使这些变量全局可见,这在我的作业中是不允许的:)
答案 0 :(得分:2)
父母与孙子女之间没有直接沟通。这里通常的方法是让孙子将PID存储在文件系统的某个地方(例如,在/var/lib/myapp/grandchild.pid中)并在父文件中读回它。
您也可以在Linux上使用进程组,但它们提供了粗粒度的方法。
答案 1 :(得分:1)
dunno如果这完美无瑕,但主要想法就在这里
int fd[2]; /*write(fd[1],buffer,strlen)
/ read(fd[0],buffer2,SIZE)*/
pid_t cpid,savepid;
if(pipe(fd)==-1){
perror("pipe");
exit(EXIT_FAILURE);
}
if((cpid=fork())<0){/* FORK INIT FOR CHILD */
printf("\n\tFORK ERROR\n");
exit(1);
}
if(cpid==0){ /*process CHILD*/
if((cpid=fork())<0){/* FORK INIT FOR GRANDCHILD */
printf("\n\tFORK ERROR\n");
exit(1);
}
if(cpid==0){ /*process GRANDCHILD*/
close(fd[0]);
if((write(fd[1],(char*)pid,strlen(final2)))<0){
perror("\n\tWRITE ERROR");
}
/********CODE******/
close(fd[1]);
}else{ /*process CHILD*/
/********CODE******/
}
}else{ /*process PARENT*/
close(fd[1]);
if((read(fd[0],(char*)savepid,NN))<0){
perror("\n\tREAD ERROR");
}
/********CODE******/
kill(savepid,SIGKILL);
/*code parent*/
wait(NULL);
close(fd[0]);
}