Co stanie się z wielowątkowym procesem Linuksa, jeśli otrzyma sygnał?

20

Jeśli proces uniksowy (Posix) odbierze sygnał, uruchomi się procedura obsługi sygnału.

Co się z tym stanie w procesie wielowątkowym? Który wątek odbiera sygnał?

Moim zdaniem interfejs API sygnału powinien zostać rozszerzony, aby sobie z tym poradził (tzn. Wątek modułu obsługi sygnału powinien być w stanie określić), ale szukając informacji w sieci, znalazłem tylko całoroczne płomienie na liście mailingowej jądra Linuksa i na różne fora. Jak zrozumiałem, koncepcja Linusa różniła się od standardu Posix i najpierw zbudowano warstwę kompatybilności, ale teraz Linux podąża za modelem posix.

Jaki jest obecny stan?

peterh - Przywróć Monikę
źródło
3
Duplikat stackoverflow.com/questions/11679568/… „pthreads (7) opisuje, że POSIX.1 wymaga wszystkich wątków w atrybutach współużytkowania procesu, łącznie z dyspozycjami sygnałów”
steve
@steve Dzięki, ale 1) jest na innej stronie SE 2) ta specyfikacja nie precyzuje jasno, co dokładnie się stanie. Co to znaczy, programy obsługi sygnałów będą wywoływane we wszystkich wątkach, ale wydaje mi się to trochę surrealistyczne. 3) Ta odpowiedź nie określa, jaki był model Linusa i dlaczego / jak jest obecnie używany.
peterh - Przywróć Monikę

Odpowiedzi:

9

Wpis w POSIX na temat „ Generowanie i dostarczanie sygnału ” w „Uzasadnienie: Interfejsy systemowe Informacje ogólne” mówi

Sygnały generowane dla procesu są dostarczane tylko do jednego wątku. Tak więc, jeśli więcej niż jeden wątek kwalifikuje się do odbioru sygnału, należy wybrać jeden. Wybór wątków zależy wyłącznie od implementacji, zarówno w celu zapewnienia jak najszerszego zakresu zgodnych implementacji, jak i zapewnienia implementacjom swobody dostarczania sygnału do „najłatwiejszego” wątku w przypadku różnic w łatwości dostarczania między różnymi gwintami.

Z signal(7)instrukcji w systemie Linux:

Sygnał może być generowany (a więc oczekujący) dla całego procesu (np. Gdy jest wysyłany przy użyciu kill(2)) lub dla określonego wątku (np. Niektóre sygnały, takie jak SIGSEGV i SIGFPE, generowane w wyniku wykonania określonej maszyny instrukcje językowe są kierowane na wątek, podobnie jak sygnały kierowane na określony wątek za pomocą pthread_kill(3)) Sygnał ukierunkowany na proces może być dostarczony do dowolnego z wątków, które obecnie nie mają zablokowanego sygnału. Jeśli więcej niż jeden wątek ma odblokowany sygnał, jądro wybiera dowolny wątek, do którego ma dostarczyć sygnał.

I w pthreads(7):

Wątki mają różne ustawienia stosu sygnałów alternatywnych. Jednak ustawienia alternatywnego stosu sygnałów nowego wątku są kopiowane z wątku, który go utworzył, tak że wątki początkowo współużytkują alternatywny stos sygnałów (ustalony w jądrze 2.6.16).

Z pthreads(3)instrukcji w systemie OpenBSD (jako przykład alternatywnego podejścia):

Procedury obsługi sygnałów są zwykle uruchamiane na stosie aktualnie wykonywanego wątku.

(Obecnie nie wiem, jak to się robi, gdy wiele wątków jest wykonywanych jednocześnie na komputerze wieloprocesorowym)

Starsza implementacja wątków POSIX dla LinuxThread pozwalała na sygnały tylko dla pojedynczych wątków. Z pthreads(7)systemu Linux:

LinuxThreads nie obsługuje pojęcia sygnałów ukierunkowanych na proces: sygnały mogą być wysyłane tylko do określonych wątków.

Kusalananda
źródło