gpt4 book ai didi

c - 进程相互跟踪

转载 作者:太空宇宙 更新时间:2023-11-04 10:38:23 25 4
gpt4 key购买 nike

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

#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...

最佳答案

默认情况下,ptraced 进程将在收到信号时停止。当您的 child 引发 SIGTRAP 时,会向 parent 发送一个 SIGCHLD 信号。由于正在跟踪父项,因此它会停止,子项也会停止。死锁。

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

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

关于c - 进程相互跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36283255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com