Что происходит в Linux, когда программа (которая, возможно, имеет несколько потоков) получает сигнал, например SIGTERM или SIGHUP?
Какой поток перехватывает сигнал? Могут ли несколько потоков получать один и тот же сигнал? Есть ли специальный поток, полностью посвященный обработке сигналов? Если нет, что происходит внутри потока, который должен обрабатывать сигнал? Как выполнение возобновляется после завершения подпрограммы обработчика сигналов?
pthreads(7)
описывает, что POSIX.1 требует, чтобы все потоки в атрибутах общего доступа процесса, включая:POSIX.1 также требует, чтобы некоторые атрибуты были разными для каждого потока, в том числе:
маска сигнала (
pthread_sigmask(3)
)альтернативный стек сигналов (
sigaltstack(2)
)complete_signal
Подпрограмма ядра Linux имеет следующий блок кода - комментарии весьма полезны:Итак, вы видите, что отвечаете за то, куда доставляются сигналы:
Если ваш процесс установил для сигнала значение
SIG_IGN
илиSIG_DFL
, то сигнал игнорируется (или по умолчанию - kill, core или ignore) для всех потоков.Если ваш процесс установил расположение сигнала для определенной процедуры-обработчика, вы можете контролировать, какой поток будет получать сигналы, манипулируя масками сигналов определенных потоков, используя
pthread_sigmask(3)
. Вы можете назначить один поток для управления ими всеми, или создать один поток для каждого сигнала, или любую комбинацию этих опций для определенных сигналов, или вы полагаетесь на текущее поведение ядра Linux по умолчанию при доставке сигнала в основной поток.Однако некоторые сигналы являются особыми согласно
signal(7)
справочной странице:источник