2012-05-31 3 views
10

Я использую библиотеку pthread под Linux для создания потоков, и у меня есть два вопроса об обработке сигналов в таких приложениях.Pthread threads and signals

Я знаю, что обработчики сигналов являются общесистемными, что означает, что если я установлю обработчик в процессе, каждый поток будет иметь этот обработчик сигналов, также я знаю, что есть функция pthread_kill для отправки сигналов в определенные потоки.

У меня есть вопрос о посылке сигналов, используя, например оболочки kill команды, насколько я понимаю, если я типа, например kill -INT PID Я пошлю SIGINT обработать с этим PID, если это многопоточная программа, то сигнал будет доставлен к одному из потоков в этом процессе.

Первый вопрос, у меня не будет никакой гарантии, какой из потоков будет передан этот сигнал, я могу только быть уверенным, что он будет доставлен в один поток без этого сигнала в сигнальной маске?

Если так, то о нескольких сигналах, которые доставляются в конкретный поток, например «SIGFPE», «SIGSEGV», если я отправлю их с помощью команды оболочки kill, они будут доставлены в случайную цепочку или они будут доставлены в поток что создало другие потоки?

+0

Я не уверен, но я считаю, что сигнал будет посылать ко всем потокам программы. – Shahbaz

+1

Когда сигнал генерируется процессором (например, FPE или SEGV), он будет доставлен в точную нить, которая его подняла (которая выполняла сбойную инструкцию). Если вы используете утилиту 'kill', она отправит тот же сигнал, что и весь процесс. Таким образом, «процесс-широкая»/зависящая от потока информация о сигнале _how_ генерируется, а не о _which_ сигнале. – osgx

+0

@osgx Хорошо, это отвечает на второй вопрос, но я прав насчет стратегии выбора потоков для сигналов, а это значит, что сигнал будет доставлен в случайный поток, который не блокирует или игнорирует его? – Andna

ответ

12

Приводя man pthreads

POSIX.1 различает понятия сигналов, которые направлены к процессу в целом и сигналы, которые направлены на отдельные нити. Согласно POSIX.1, направленный на процесс сигнал (отправленный с использованием kill (2), например) должен обрабатываться одним, произвольно выбранным потоком в процессе.

Были проблемы в Linux в дни glibc 2.2 и старше (linuxthreads использовался как реализация pthread); но с glibc 2.3-2.4 есть NPTL, который более точно соответствует POSIX о сигналах.

Я могу только быть уверенным, что он будет доставлен в один поток без этого сигнала в сигнальной маске?

Если вы используете kill - yes; к случайному потоку, который не блокирует этот сигнал.

Если да, то о нескольких сигналах, которые доставляются к конкретной теме, как «SIGFPE», «SIGSEGV»,

Они поставляются в определенную тему, только когда генерируется CPU/ядро ​​(по конкретная инструкция в некотором контексте); не kill утилита с ПИДОМ аргументом

, если я пошлю их, используя команду убить оболочки, они будут доставлены в случайный поток или они будут доставлены в поток, который создал другие темы?

Они будут доставлены в случайную цепочку процессов, обычно отсылает сигналы технологического процесса. Но если сигнал смертелен, все потоки в процессе будут уничтожены.

PS: http://www.linuxprogrammingblog.com/all-about-linux-signals?page=11

+2

Спасибо за ответы и статью. – Andna