2016-03-29 8 views
0

私は子プロセスを作成しようとしています。その後、子供はその親にアタッチしようとします。保護の理由から、プロセスでは子プロセスしか追跡できないため、sudoでコードを実行する必要があります。私は2つのプロセスの間にいくつかのコミュニケーションを作りたいので、私は親にdo-whileループを入れます。子が終了する場合、親も終了する必要があります。私の出力はChild is tracedしかないので、私はその子が親に接続していないと仮定します。お互いをトレースするプロセス

私が手 raise(SIGTRAP)をコメントアウト
#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); 
} 

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

答えて

1

信号がそれに配信されたときptraceさプロセスは、デフォルトでは、停止してしまいます。あなたの子供がSIGTRAPを起こすと、SIGCHLDシグナルが親に送られます。親は追跡されているので、子供の場合と同様に停止します。デッドロック。あなたは親がSIGCHLDを無視持つようにコードを追加した場合

、プログラムが期待通りに動作します:

Child is traced 
Child is tracing 
Child stopped: 5 
Stopsig status 5. 
Child exiting... 
Parent exiting... 
関連する問題