根据ptrace
文档。
在下一个
clone(2)
停止跟踪并自动开始跟踪新克隆的进程,该进程将以SIGSTOP
开头,如果使用PTRACE_EVENT_STOP
,则为PTRACE_SEIZE
。< / p>
问题是SIGSTOP
可能根本不是ptrace
引起的 - 甚至用户也可以将此信号发送给进程。在这种情况下,由PTRACE_EVENT_STOP
停止的子进程将非常完美。
我自己产生了一个子进程,因此使用PTRACE_TRACEME
是开始跟踪它的最佳方式 - 它没有竞争条件。如果我坚持使用PTRACE_SEIZE
,那么在我在父进程中调用PTRACE_SEIZE
之前,子进程可能已经退出。
有没有办法阻止子进程在使用SIGSTOP
进行跟踪时收到普通PTRACE_TRACEME
?
答案 0 :(得分:0)
简而言之,你不能。
然而,有好消息。从Linux 3.4版开始,ptrace
支持新操作PTRACE_SEIZE
。它来自父级而不是子级,因此附加语义有些不同。除此之外,它有一些差异,其中之一是它解决了这个特殊问题。
您需要阅读手册页以获取血腥细节。如果您使用它,几乎所有关于报告事件的方式都会发生变化。这个问题(以及类似问题)正是它被引入的原因,所以如果这个问题困扰你,你绝对应该使用PTRACE_SEIZE
而不是PTRACE_TRACEME
,尽管有不便之处。