Сигналы могут быть отправлены либо процессу, либо определенному потоку. Для сигналов, отправляемых процессу, сигнал будет доставлен, как только есть хотя бы один поток, где этот сигнал не заблокирован, и, если таких потоков более одного, он может быть доставлен любому из них (непредсказуемым, который один). Для сигналов, отправляемых определенному потоку, они доставляются, как только этот поток не блокирует сигнал.
Использование функции raise
для подачи сигнала посылает сигнал потоку, который вызвал raise
, а не весь процесс. Сигналы, автоматически генерируемые в результате действий потока (например, SIGSEGV
SIGFPE
и SIGPIPE
), также доставляются в этот конкретный поток.
Сигналы, генерируемые терминалом (SIGINT
, SIGTSTP
, SIGQUIT
), доставляются всему процессу.
Невозможно установить отдельные обработчики сигналов для каждого потока, но обработчик сигнала для сигнала может быть в состоянии проверить, в каком потоке он работает. Если вы знаете, что сигнал не прерывал асинхронную синхронизацию -signal-unsafe функция, вы можете вызвать pthread_self
, чтобы получить текущий идентификатор потока. В противном случае, один уродливый, но безопасный способ - взять адрес errno
и посмотреть, в каком потоке вы на нем основаны (вам придется самостоятельно вести таблицу сопоставления и убедиться, что доступ к этой таблице является асинхронным сигналом. -safe).