gpt4 book ai didi

c++ - ptrace如何捕捉fork的系统调用?

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

我尝试使用 ptrace 来捕获子进程系统调用 ID,例如 execve(11) 或 fork(2)。

我的代码在这里。

#include <sys/syscall.h>
#include <sys/reg.h>
#include <sys/ptrace.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>

int main(){
pid_t pid;
if ((pid = fork()) == 0){
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
pid_t t = fork();
} else{
int status;
struct rusage resource;
while (true){
wait4(pid, &status, 0, &resource);
if (WIFEXITED(status)) break;
int syscall = ptrace(PTRACE_PEEKUSER, pid, 4 * ORIG_EAX, NULL);
if (syscall == SYS_execve) printf("%d\n", syscall);
ptrace(PTRACE_SYSCALL, pid, NULL, NULL);
}
}
return 0;
}

在我看来,程序应该在屏幕上打印“2”(因为系统调用“fork”的 ID 是 2),但程序完成后我什么也没得到。有人可以解释一下吗?

最佳答案

如果你的程序已经正常退出,那么

if (WIFEXITED(status)) break;

此语句可能导致不打印 2,因为它将它从循环中取出。

请参阅此声明。

关于c++ - ptrace如何捕捉fork的系统调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20440118/

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