查看 strace 时的 SIG_0 是什么

spu*_*der 4 linux c++ strace

将 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. 
Run Code Online (Sandbox Code Playgroud)

Aar*_*ler 6

来自man tgkill

tgkill() 将信号 sig 发送到线程组 tgid 中线程 ID 为 tid 的线程。(相比之下,kill(2) 只能用于向整个进程(即线程组)发送信号,并且该信号将被传递到该进程内的任意线程。)

这给我们留下了信号 0 代表什么的问题。答案是,根本没有

如果您有一个进程 ID 但不确定它是否有效,您可以使用最不可能的候选者来测试它:kill 命令。如果您在 kill(1) 手册页上没有看到任何对此的引用,请检查信息页。man/info 页面指出信号 0 是特殊的,并且 kill 的退出代码表明信号是否可以发送到指定的进程(或多个进程)。

tgkill然后,这些调用正在测试您通过strace. 返回值 0 表示这样测试的线程确实存在;现在要回答的问题是,为什么这个过程会在测试中循环?(无论如何,我认为这就是它正在做的事情;大概如果它做过你看到的任何其他事情,你就会在你的问题中提到它。)