Запись в POSIX « Генерация и доставка сигналов » в «Обоснование: общие сведения о системных интерфейсах» гласит:
Сигналы, сгенерированные для процесса, доставляются только одному потоку. Таким образом, если более одного потока имеют право на получение сигнала, необходимо выбрать один. Выбор потоков полностью зависит от реализации, чтобы обеспечить как можно более широкий диапазон соответствующих реализаций и предоставить реализациям свободу доставлять сигнал в «самый простой из возможных» потоков, если будут различия в простоте доставки между различными потоками.
Из signal(7)
руководства по системе Linux:
Сигнал может быть сгенерирован (и, следовательно, ожидает рассмотрения) для процесса в целом (например, при отправке с использованием kill(2)
) или для конкретного потока (например, определенных сигналов, таких как SIGSEGV и SIGFPE, сгенерированных как следствие выполнения конкретной машины). языковые инструкции ориентированы на потоки, как и сигналы, нацеленные на использование определенного потока pthread_kill(3)
). Направленный на процесс сигнал может быть доставлен в любой из потоков, для которого в данный момент сигнал не заблокирован. Если более одного из потоков имеет разблокированный сигнал, то ядро выбирает произвольный поток для доставки сигнала.
И в pthreads(7)
:
Потоки имеют различные альтернативные настройки стека сигналов. Однако настройки альтернативного стека сигналов нового потока копируются из потока, который его создал, так что изначально потоки совместно используют стек альтернативных сигналов (исправлено в ядре 2.6.16).
Из pthreads(3)
руководства по системе OpenBSD (как пример альтернативного подхода):
Обработчики сигналов обычно выполняются в стеке текущего выполняющегося потока.
(В настоящее время я не знаю, как это обрабатывается, когда несколько потоков выполняются одновременно на многопроцессорной машине)
Более старая реализация LinuxThread потоков POSIX позволяла направлять сигналы только по отдельным потокам. Из pthreads(7)
системы Linux:
LinuxThreads не поддерживает понятие процессов-ориентированных сигналов: сигналы могут отправляться только в определенные потоки.