Co się dzieje w systemie Linux, gdy program (który może mieć wiele wątków) odbiera sygnał, taki jak SIGTERM lub SIGHUP?
Który wątek przechwytuje sygnał? Czy wiele wątków może otrzymać ten sam sygnał? Czy istnieje specjalny wątek poświęcony wyłącznie obsłudze sygnałów? Jeśli nie, co dzieje się wewnątrz wątku, który ma obsłużyć sygnał? Jak wznawia się wykonywanie po zakończeniu procedury obsługi sygnału?
pthreads(7)
opisuje, że POSIX.1 wymaga wszystkich wątków w atrybutach udziału procesu, w tym:POSIX.1 wymaga również, aby niektóre atrybuty były odrębne dla każdego wątku, w tym:
maska sygnału (
pthread_sigmask(3)
)alternatywny stos sygnału (
sigaltstack(2)
)Procedura jądra Linuksa
complete_signal
ma następujący blok kodu - komentarze są bardzo przydatne:Więc widać, że ty jesteś odpowiedzialny za gdzie sygnały są dostarczane:
Jeśli twój proces ustawił dyspozycję sygnału na
SIG_IGN
lubSIG_DFL
, sygnał jest ignorowany (lub domyślnie - kill, core lub ignore) dla wszystkich wątków.Jeśli twój proces ustawił dyspozycję sygnału na określoną procedurę obsługi, możesz kontrolować, który wątek otrzyma sygnały, manipulując określonymi maskami sygnału wątku za pomocą
pthread_sigmask(3)
. Możesz wyznaczyć jeden wątek do zarządzania nimi wszystkimi lub utworzyć jeden wątek na sygnał lub dowolną mieszankę tych opcji dla określonych sygnałów, lub polegać na bieżącym domyślnym zachowaniu jądra Linuksa polegającym na dostarczaniu sygnału do głównego wątku.Jednak niektóre sygnały są specjalne według strony podręcznika
signal(7)
:źródło