Нить main()
не является особенной. Он принимает сигналы, как и любой другой поток.
Когда сигнал генерируется «асинхронно» для процесса или группы процессов (например, с помощью kill
или Ctrl- C на терминале), реализация может выберите любой поток для доставки.
Поток, выполняющий main()
, ничем не отличается от любого другого потока в процессе. Если вы хотите контролировать, какой поток получает сигнал, вы должны заблокировать доставку сигнала во всех потоках, кроме одного, или заблокировать и вызвать sigwait
из нужного потока.
Когда сигнал генерируется «синхронно» в пределах поток (как raise
, abort
, ошибка сегментации и т. д. c.) или нацелен на указанный поток c (как pthread_kill
), тогда этот поток и только этот поток будет получить сигнал. Если этот поток блокирует сигнал, то сигнал удерживается в ожидании до тех пор, пока не будет разблокирован или принят.
Здесь два очень хороших источника - это всеобъемлющая, но сравнительно плотная POSIX обработка и приятно доступная GNU lib c обработка из UNIX сигналов. Однако оба ориентированы на C, а не на C ++.