我正在尝试创建一个子进程,要求其父进程跟踪他。在此之后,孩子尝试附加到其父母。由于某些保护原因,进程只能跟踪其子进程,因此我必须使用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...
答案 0 :(得分:1)
默认情况下,ptraced进程会在向其发送信号时停止。当您的孩子提出SIGTRAP时,会向父母发送SIGCHLD信号。由于父母被追踪,它会像孩子一样停止。死锁。
如果添加代码以使父忽略SIGCHLD,程序将按预期运行:
Child is traced
Child is tracing
Child stopped: 5
Stopsig status 5.
Child exiting...
Parent exiting...