向某些(grand -...)孙子发送信号

时间:2013-05-10 10:48:41

标签: c signals fork

有没有一种方法可以直接将SIGUSR发送给孙子? 例如。我有一些进程树:

     0
    / \
   1   2
        \
         3

需要从03发送信号。

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

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

...

kill(savepid,sig);

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

2 个答案:

答案 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]);
}