2016-03-29 25 views
0

Bir ebeveyn süreci oluşturmaya çalışıyorum, ebeveyninin izini sürmesini istiyor. Bundan sonra çocuk ebeveynine bağlamaya çalışır. Bazı koruma nedenlerinden dolayı süreçler yalnızca çocuklarını izleyebilir, bu yüzden kodumu sudo ile yürütmem gerekiyor. İki süreç arasında biraz iletişim kurmak istiyorum, bu yüzden ebeveyne bir do-while döngüsü koydum. Çocuk feshederse ebeveyn de sonlandırılmalıdır. Benim çıktım sadece Child is traced, bu yüzden çocuğun ebeveyne bağlı olmadığını varsayalım.Birbirini takip eden süreçler

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <signal.h> 
#include <sys/ptrace.h> 
#include <sys/wait.h> 

void child(); 
void parent(pid_t pid); 

int main() { 
    pid_t pid = fork(); 
    if(pid == 0) 
     child(); 
    else if(pid > 0) 
     parent(pid); 
    else{ 
     perror("fork"); 
     exit(EXIT_FAILURE); 
    } 
} 


void child(){ 
    if(ptrace(PTRACE_TRACEME, 0, 0, 0) < 0){ 
     perror("ptrace"); 
     exit(EXIT_FAILURE); 
    } 
    printf("Child is traced\n"); 


    pid_t ppid = getppid(); 
    if(ptrace(PTRACE_SEIZE, ppid, NULL, NULL) != 0) { 
     perror("ptrace"); 
     exit(EXIT_FAILURE); 
    } 

    printf("Child is tracing\n"); 

    raise(SIGTRAP); 

    ptrace(PTRACE_DETACH, ppid, NULL, NULL); 

    printf("%s\n", "Child exiting..."); 
    exit(EXIT_SUCCESS); 
} 


void parent(pid_t pid){ 
    int status; 
    do{ 
     waitpid(pid, &status, WUNTRACED | WCONTINUED); 
     if(WIFSTOPPED(status)){ 
      printf("Child stopped: %d\n", WSTOPSIG(status)); 
      if(WSTOPSIG(status) == 5){ 
       printf("Stopsig status 5.\n"); 
      } 
      ptrace(PTRACE_CONT, pid, 0, 0); 
     } 
    } while(!WIFEXITED(status) && !WIFSIGNALED(status)); 

    ptrace(PTRACE_DETACH, pid, NULL, NULL); 

    printf("%s\n", "Parent exiting..."); 
    exit(EXIT_SUCCESS); 
} 

dışarı yorumlarında raise(SIGTRAP) alıyorum:

Child is traced 
Child is tracing 
Child exiting... 
Parent exiting... 

cevap

1

bir sinyal kendisine teslim edildiğinde bir ptraced süreci, varsayılan olarak, durdu alacak. Çocuğunuz SIGTRAP'ı yükselttiğinde, ebeveyne bir SIGCHLD sinyali gönderilir. Ebeveyn izlenmekte olduğundan, çocuk olduğu gibi durur. Kilitlenme. Üst SIGCHLD göz ardı etmesi için kod eklerseniz

program beklendiği gibi çalışır:

Child is traced 
Child is tracing 
Child stopped: 5 
Stopsig status 5. 
Child exiting... 
Parent exiting... 
İlgili konular