Насколько я знаю, это было бы сложно сделать.Unix сигналы примитивны.
Сигналы доставляются в случайный поток по умолчанию.Чтобы обойти это, обычно используется хитрость - блокировать сигналы во всех потоках, кроме одного.Самый простой способ сделать это - заблокировать все сигналы в основном с помощью pthread_sigmask
, затем создать потоки (которые будут наследовать маску сигналов), а затем создать отдельный поток, который выполняет sigwait/sigwaitinfo
для заблокированных сигналов.Это вынуждает сигналы доставляться в этот поток.
После использования сигнала в потоке захвата сигнала вам нужно будет сделать pthread_kill
с идентификатором основного потока и номером перехваченного сигнала, чтобы переслать сигнал наглавный.Проблема в том, что main блокировал бы его.
Вы не можете действительно разблокировать main и заблокировать поток сбора сигналов перед пересылкой сигнала, потому что это состояние гонки - ничто не мешает поступлению второго сигналаи нить, улавливающая сигнал, не видя его.Это сводит на нет все усилия.
Вы можете сделать так, чтобы сигнальный поток отправлял сообщение main через какую-то другую форму IPC (канал или что-то еще), говоря: «поймал XX, примите соответствующие меры».Может быть, этого достаточно?
Может быть, у кого-то есть какая-то умная идея, но я подозреваю, что суть в том, что это просто не то, что обычно делается в unix.