2011-08-05 65 views
7

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

如果SIGSTOP排队,是否有任何方法将它从该进程外的队列中移出,例如在跟踪过程中?

+0

我还没有能够挖掘一个权威的答案。 OpenBSD的man页面暗示可能发生的事情,但不能以某种方式明确回答。请参阅http://www.openbsd.org/cgi-bin/man.cgi?query=sigaction&apropos=0&sektion=0&manpath=OpenBSD+Current&arch=i386&format=html和http://www.openbsd.org/cgi-bin/man .cgi?query = sigsuspend&sektion = 2&arch = i386&apropos = 0&manpath = OpenBSD + Current – wallyk

回答

3

从信号(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) 
0

你是什么意思'停止由于SIGTRAP信号'? SIGTRAP不会停止一个过程;默认情况下它会以核心转储结束,或者您可以将其更改为忽略信号或调用信号处理程序,但在任何情况下SIGTRAP本身都不会停止该进程。你可能会用一些其他进程(如调试器)跟踪进程,并在ptrace(2)之后进行跟踪,在这种情况下,它将在交付SIGTRAP之前停止,但在这种情况下,它将受到ptrace的控制,继续,直到有PTRACE_CONT或其他ptrace操作才能继续该过程。

+0

我正在追踪另一个进程并充当调试器,所以当进程遇到断点时,它将传递一个SIGTRAP并且进程停止。所以我只想知道它是否停止并且已经传递了SIGTRAP信号,如果在SIGSTOP传递给进程后会发生什么?它会处于等待状态还是仅仅因为过程已经停止而被丢弃? – ayelder