LINUX.ORG.RU

POSIX threads & signals


0

0

Привет! Кто-нибудь знает, как обрабатываются сигналы в многопотоковых приложениях? Допустим, я установил обработчик какого-нибудь сигнала, и после этого запустил толпу thread'ов. Когда мое приложение получит ентот самый сигнал, как будет вызываться обработчик? Скорее всего, только для одного треда? Какого из них? Судя по сорцам, первого попавшегося, хотя я могу ощибаться... Вообще, может кто-нибудь знает где почитать какие libc-шные функции как реализованы при использовании POSIX threads/libc_r? Ну окромя сорцов ессно - а то времени жаль :)

Заранее пасиба

anonymous

Каждая нить имеет свою маску (pthread_sigmask()) а обработчики одни на весь процесс. При передачи сигнала в процесс (kill) сигнал получает первая попавшаяся нить в которой он не заблокирован или не игнорируется. Обработчик вызывается с этой нити. Когда ты отправляеш сигнал pthread_kill он отправляется именно той нити которую ты указал (внутри процесса). А функции это: pthread_sigmask pthread_kill sigwait sigprocmask sigaction И так далее... Кажись все:))

tvn
()

Спасибо, классный и полный ответ.

bison
()
31 января 2002 г.
Ответ на: комментарий от tvn

Ответ хороший, но не совсем полный;)

И вот почему: обработчик пришедшего сигнала вызовется в контексте той нити, которая в момент прихода сигнала находится в syscall'e либо в методе из библиотеки pthread (перечень syscall'ов и методов из pthread, которые прерываются сигналами, см. в мане). Таким образом, - это не любой thread, прошу заметить;)
Если же в каком-нибудь syscall'е и методе из pthread сидят несколько thread'ов, то какой конкретно из них сорвется с вызванной функции определит scheduler, он же разруливает доставку сигналов.

От себя:
Как учит дао, для прогнозируемого приема сигнала в multithreaded приложении используют следующую технику: запускают специальный signal listening thread, который в цикле сажается на sigaction(). Как только сигнал пожаловал - вот он, пойман посредством sigaction() и непременно в signal listening thread'e.

proff
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.