Pthread темы и сигналы

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

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

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

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

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

Ответы на вопрос(1)

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

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

ВАШ ОТВЕТ НА ВОПРОС