Потоки и сигналы Pthread

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

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

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

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

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

Ответ 1

Цитирование 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",

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

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

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

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