2016-03-29 14 views
0

Ich versuche, einen Kindprozess zu erstellen, der seine Eltern auffordert, ihn zu verfolgen. Danach versucht das Kind, sich an seine Eltern anzuhängen. Aus Sicherheitsgründen können Prozesse nur ihre untergeordneten Elemente verfolgen, daher muss ich meinen Code mit sudo ausführen. Ich möchte etwas Kommunikation zwischen den zwei Prozessen schaffen, deshalb lege ich eine Do-while-Schleife in den Eltern. Wenn das Kind beendet wird, sollte der Elternteil ebenfalls enden. Meine Ausgabe ist nur Child is traced, also nehme ich an, dass das Kind nicht an das Elternteil anfügt.Prozesse, die einander verfolgen

#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); 
} 

Kommentar aus den raise(SIGTRAP) ich:

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

Antwort

1

Ein ptraced Prozess wird standardmäßig angehalten werden, wenn ein Signal an sie geliefert wird. Wenn Ihr Kind SIGTRAP auslöst, wird ein SIGCHLD-Signal an den Eltern gesendet. Da der Elternteil verfolgt wird, stoppt er ebenso wie das Kind. Sackgasse.

Wenn Sie Code hinzufügen, die Eltern haben SIGCHLD ignorieren, läuft das Programm wie erwartet:

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