2011-08-05 13 views
7

Jeśli proces jest obecnie zatrzymany z powodu sygnału SIGTRAP i zostanie wysłany sygnał SIGSTOP przez kill(), jakie będzie domyślne zachowanie? Czy SIGSTOP będzie sygnałem oczekującym, który zostanie dostarczony po ponownym rozpoczęciu procesu? Czy po prostu zostanie odrzucony/zignorowany?Zachowanie sygnału POSIX

Jeśli SIGSTOP znajduje się w kolejce, czy istnieje sposób usunięcia go z kolejki spoza tego procesu, na przykład w procesie śledzenia?

+0

Nie byłem w stanie wykopać autorytatywnej odpowiedzi. Strony podręcznika OpenBSD podpowiadają, co może się stać, ale nie definitywnie nie odpowiedzą na nie w ten czy inny sposób. Zobacz http://www.openbsd.org/cgi-bin/man.cgi?query=sigaction&apropos=0&sektion=0&manpath=OpenBSD+Current&arch=i386&format=html i http://www.openbsd.org/cgi-bin/man .cgi? query = sigsuspend & sektion = 2 & arch = i386 & apropos = 0 & manpath = OpenBSD + Current – wallyk

Odpowiedz

3

od sygnału (7) strony man:

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

Prosty test z aplikacji zatrzymany na przerwania i wysłanie go do SIGSTOP pokazuje gdb wyświetlając informacje kiedy uderzy „Next”. Sygnał został oczywiście dostarczony do aplikacji. Nie można kontynuować debugowania, dopóki nie wyślę go pod numer 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

Co to znaczy "zatrzymany z powodu sygnału SIGTRAP"? SIGTRAP nie zatrzyma procesu; domyślnie kończy się zrzutem rdzenia lub można go zmienić, aby zignorował sygnał lub wywołał procedurę obsługi sygnału, ale w żadnym przypadku SIGTRAP nie zatrzyma procesu samodzielnie. Możliwe, że proces jest śledzony przez inny proces (taki jak debugger) z ptrace (2), w którym to przypadku zatrzyma się tuż przed dostarczeniem SIGTRAP, ale w tym przypadku jest pod kontrolą ptrace i nie będzie Kontynuuj, dopóki nie zostanie wykonana akcja PTRACE_CONT lub inna akcja ptrace, aby kontynuować proces.

+0

Śledzę inny proces i działa jako debugger, więc kiedy proces osiągnie punkt przerwania, zostanie dostarczony SIGTRAP i proces zostanie zatrzymany. Więc chcę tylko wiedzieć, czy jest zatrzymany i czy dostarczono ten sygnał SIGTRAP, co się stanie, jeśli po tym SIGSTOP zostanie dostarczony do procesu? Czy będzie on w toku, czy zostanie po prostu odrzucony, ponieważ proces jest już zatrzymany? – ayelder