3

有没有直接向孙子发送 SIGUSR 的好方法?例如,我有一些进程树:

     0
    / \
   1   2
        \
         3

0并需要从to发送信号3

我知道我可以在分叉后保存孩子的 pid 并将其与kill()like一起使用

pid = fork();
if (pid == 0) { 
    pid = fork();
    if (pid == 0) { /* grandchild */ }
    savepid = pid;
}

...

kill(savepid,sig);

但是我必须使用共享内存来使这些变量全局可见,这在我的作业中是不允许的:)

4

2 回答 2

2

父母和孙子之间没有直接的交流。这里常用的方法是让孙子将其 PID 存储在文件系统的某个位置(例如,在 /var/lib/myapp/grandchild.pid 中)并将其读回父级。

您也可以在 Linux 上使用进程组,但它们提供了一种粗粒度的方法。

于 2013-05-10T10:56:15.503 回答
1

不知道这是否完美无缺,但主要的想法就在这里

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]);
}
于 2013-05-10T11:00:55.110 回答