Вопрос по linux – Pthread темы и сигналы

10

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

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

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

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

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

Я не уверен, но я верю, что сигнал будет отправлен всем потокам программы. Shahbaz
@osgx Хорошо, это ответ на второй вопрос, но я прав насчет стратегии выбора потока для сигналов, что означает, что сигнал будет доставлен в случайный поток, который не блокирует или игнорирует его? Andna
От:linuxprogrammingblog.com/all-about-linux-signals?page=11 "Он доставлен одному из потоков в процессе с разблокированным этим сигналом". Не указано, какой поток получит его. Если сигнал у всех потоков заблокирован, он помещается в очередь на процесс. Если для сигнала не определен обработчик сигнала и действие по умолчанию - завершить процесс ... весь процесс завершается. & Quot; osgx
Когда сигнал генерируется процессором (например, FPE или SEGV), он будет доставлен точному потоку, который его поднял (который выполнил ошибочную инструкцию). Если вы используетеkill утилита, он будет отправлять тот же сигнал, что и для всего процесса. Так что «весь процесс» / «конкретный поток»how сигнал генерируется, а не оwhich сигнал генерируется. osgx

Ваш Ответ

1   ответ
12

Приводячеловек ловит

POSIX.1 distinguishes the notions of signals that are directed to the process as a whole and signals that are directed to individual threads. According to POSIX.1, a process-directed signal (sent using kill(2), for example) should be handled by a single, arbitrarily selected thread within the process.

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

I can only be sure that it will be delivered to one thread without this signal in signal mask?

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

If so what about few signals that are delivered to particular thread, like 'SIGFPE', 'SIGSEGV',

Они доставляются в определенный поток, только когда генерируются процессором / ядром (по определенной инструкции в некотором контексте); неkill утилита с аргументом PID

if I will send them using kill shell command they will be delivered to random thread or will they be delivered to the thread that created other threads?

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

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

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

Похожие вопросы