2013-05-10 5 views
2

Есть ли хороший способ отправить SIGUSR внуку напрямую? . У меня есть некоторый процесс дерево:Отправка сигнала определенным (grand -...) внукам

 0 
    /\ 
    1 2 
     \ 
     3 

и нужно послать сигнал от 0 к 3.

Я знаю, что я мог бы спасти ВЗОМТ ребенка после того, как разветвление и использования его с kill() как

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

... 

kill(savepid,sig); 

, но тогда я должен был бы использовать общую память, чтобы сделать эти переменной видимыми глобально, что не допускается в моем домашняя работа :)

+0

использовать 'трубу()' для 'на общаются pid3' в '0' –

ответ

2

Прямой связи между родителями и внуками нет. Обычный подход здесь заключается в том, что внук хранит свой PID где-то в файловой системе (например, в /var/lib/myapp/grandchild.pid) и читает его обратно в родительском.

Вы также можете использовать группы процессов в Linux, но они предлагают грубый подход.

+0

Вы также можете послать сигнал на первого ребенка (родителя внука), и получите, чтобы получить его потом от ребенка. – Magn3s1um

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]); 
} 
+0

Благодарим вас за пример 'pipe()', но теперь я, вероятно, просто буду использовать pidfiles. –

+0

@MikeRoll np, он был отредактирован/исправлен на всякий случай –

Смежные вопросы