3

SIGUSR を孫に直接送信する良い方法はありますか? たとえば、私はいくつかのプロセスツリーを持っています:

     0
    / \
   1   2
        \
         3

0からに信号を送信する必要があります3

kill()分岐後に子の pid を保存し、それを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 に答える