Я использую библиотеку pthread под Linux для создания потоков, и у меня есть два вопроса об обработке сигналов в таких приложениях.Pthread threads and signals
Я знаю, что обработчики сигналов являются общесистемными, что означает, что если я установлю обработчик в процессе, каждый поток будет иметь этот обработчик сигналов, также я знаю, что есть функция pthread_kill
для отправки сигналов в определенные потоки.
У меня есть вопрос о посылке сигналов, используя, например оболочки kill
команды, насколько я понимаю, если я типа, например kill -INT PID
Я пошлю SIGINT
обработать с этим PID
, если это многопоточная программа, то сигнал будет доставлен к одному из потоков в этом процессе.
Первый вопрос, у меня не будет никакой гарантии, какой из потоков будет передан этот сигнал, я могу только быть уверенным, что он будет доставлен в один поток без этого сигнала в сигнальной маске?
Если так, то о нескольких сигналах, которые доставляются в конкретный поток, например «SIGFPE», «SIGSEGV», если я отправлю их с помощью команды оболочки kill
, они будут доставлены в случайную цепочку или они будут доставлены в поток что создало другие потоки?
Я не уверен, но я считаю, что сигнал будет посылать ко всем потокам программы. – Shahbaz
Когда сигнал генерируется процессором (например, FPE или SEGV), он будет доставлен в точную нить, которая его подняла (которая выполняла сбойную инструкцию). Если вы используете утилиту 'kill', она отправит тот же сигнал, что и весь процесс. Таким образом, «процесс-широкая»/зависящая от потока информация о сигнале _how_ генерируется, а не о _which_ сигнале. – osgx
@osgx Хорошо, это отвечает на второй вопрос, но я прав насчет стратегии выбора потоков для сигналов, а это значит, что сигнал будет доставлен в случайный поток, который не блокирует или игнорирует его? – Andna