将 strace 附加到正在使用大量 CPU 的进程,显示 pid 被反复“杀死”。
该进程使用了 130% 的 CPU。什么是 tgkill(SIG_0)?
strace -p 3876
nanosleep({0, 100000}, NULL) = 0
tgkill(3876, 3884, SIG_0) = 0
tgkill(3876, 3885, SIG_0) = 0 ...repeats over and over.
答案1
tgkill() 将信号 sig 发送给线程组 tgid 中线程 ID 为 tid 的线程。(相比之下,kill(2) 只能用于向整个进程(即线程组)发送信号,并且信号将被传递给该进程内的任意线程。)
这只留下一个问题:信号 0 代表什么。答案是,根本没有:
如果您有进程 ID,但不确定它是否有效,您可以使用最不可能的候选者来测试它:kill 命令。如果您在 kill(1) 手册页上没有看到对此的任何引用,请检查信息页。man/info 页面指出信号 0 是特殊的,并且 kill 的退出代码表明是否可以将信号发送到指定的进程(或多个进程)。
然后,这些tgkill
调用将测试您通过 监视的任何进程中是否存在各种线程strace
。返回值 0 表示经过测试的线程确实存在;现在要回答的问题是,为什么进程要循环进行测试?(无论如何,我假设这就是它正在做的事情;大概如果它做过您看到的其他事情,您会在问题中提到它。)