2011-08-05 106 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