使 tracee 停止的条件,即使它的父级不需要它

Conditions that make a tracee stopped, even though its parent didn't require it

我正在尝试学习使用 ptrace,我编写了一个简单的程序集存根,它 1/ 调用 ptrace(0,0,0,0)(系统调用,而不是 libc 函数)。然后显示 hello world 然后生成一个 shell。我 运行 我的代码来自 bash shell。 显示 Hello world,但是我的进程在 execve(/bin/sh) 之前停止(我收到后台进程的 bash 通知) 是因为 ptrace 吗?此外,当发出“fg”命令以继续执行时,没有任何反应,我必须关闭终端,因为 ctrl-c 不起作用......到底发生了什么?

来自execve man page

If the current program is being ptraced, a SIGTRAP signal is sent to it after a successful execve().

使用 ptrace(PTRACE_TRACEME) 使您的进程成为其父进程的跟踪器,因此即使父进程 没有 [=11],execve SIGTRAP 行为也适用于您的进程=] 或进行任何其他 ptrace 系统调用。例如如果它是像 bash 这样的普通 shell 而不是像 GDB 这样的调试器。 (我假设 PTRACE_TRACEME0。)

另请参阅 以更详细地了解 GDB 如何在 fork 之后但在 execve 之前使用 ptrace(PTRACE_TRACEME),以便 GDB 进程可以跟踪新进程。