другой обработчик сигнала для потока и процесса? Является ли это возможным - PullRequest
6 голосов
/ 04 сентября 2011

Есть несколько вопросов, касающихся сигнализации.

1) когда у процесса есть еще несколько потоков вместе с основным потоком, и если сигнал повышается, какой поток прекратит свою обработку и продолжит работу с обработчиком сигнала?Это основной поток или другой, чем основной поток?

2) Можно ли сохранить разные обработчики для одного и того же сигнала между основным потоком и конкретным потоком?

1 Ответ

15 голосов
/ 04 сентября 2011

Сигналы могут быть отправлены либо процессу, либо определенному потоку. Для сигналов, отправляемых процессу, сигнал будет доставлен, как только есть хотя бы один поток, где этот сигнал не заблокирован, и, если таких потоков более одного, он может быть доставлен любому из них (непредсказуемым, который один). Для сигналов, отправляемых определенному потоку, они доставляются, как только этот поток не блокирует сигнал.

Использование функции raise для подачи сигнала посылает сигнал потоку, который вызвал raise, а не весь процесс. Сигналы, автоматически генерируемые в результате действий потока (например, SIGSEGV SIGFPE и SIGPIPE), также доставляются в этот конкретный поток.

Сигналы, генерируемые терминалом (SIGINT, SIGTSTP, SIGQUIT), доставляются всему процессу.

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

...