POSIX信号行为

时间:2011-08-05 19:21:44

标签: c posix signals kill

如果一个进程由于SIGTRAP信号而当前停止并且通过kill()发送了一个SIGSTOP信号,那么默认行为是什么? SIGSTOP是否会在该过程再次继续后交付的待处理信号?或者它会被丢弃/忽略?

如果SIGSTOP排队,是否有办法从该进程外部将其从队列中删除,例如在跟踪过程中?

2 个答案:

答案 0 :(得分:3)

来自signal(7)手册页:

The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.

一个简单的测试,应用程序在断点处停止并向其发送SIGSTOP,显示gdb在我点击“下一个”时显示一些信息。信号显然已传递给应用程序。在我发送SIGCONT之前,它无法继续调试。

(gdb) next
Program received signal SIGSTOP, Stopped (signal).
fill (arr=0x7fffffffdff0, size=5) at tmp.cpp:28
(gdb) next
Program received signal SIGCONT, Continued.
fill (arr=0x7fffffffdff0, size=5) at tmp.cpp:28
(gdb) next
(gdb) 

答案 1 :(得分:0)

你是什么意思'由于SIGTRAP信号而停止'? SIGTRAP不会停止进程;默认情况下,它将以核心转储终止,或者您可以将其更改为忽略信号或调用信号处理程序,但在任何情况下,SIGTRAP都不会自行停止该过程。您可能会使用ptrace(2)跟踪某个其他进程(例如调试器)的进程,在这种情况下,它将在传递SIGTRAP之前停止,但在这种情况下,它将在ptrace的控制下停止,并且不会继续,直到有PTRACE_CONT或其他ptrace动作继续该过程。