进程互相跟踪

时间:2016-03-29 11:40:37

标签: c linux

我正在尝试创建一个子进程,要求其父进程跟踪他。在此之后,孩子尝试附加到其父母。由于某些保护原因,进程只能跟踪其子进程,因此我必须使用sudo执行我的代码。我想在两个进程之间创建一些通信,因此我在父进程中放置了一个do-while循环。如果孩子终止,父母也应该终止。我的输出只有Child is traced,所以我假设孩子没有附加到父母身上。

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

评论我得到的raise(SIGTRAP)

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

1 个答案:

答案 0 :(得分:1)

默认情况下,ptraced进程会在向其发送信号时停止。当您的孩子提出SIGTRAP时,会向父母发送SIGCHLD信号。由于父母被追踪,它会像孩子一样停止。死锁。

如果添加代码以使父忽略SIGCHLD,程序将按预期运行:

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