Потоки, сигналы и обработка потомков: что за мир… Что за мир

Итак, у меня есть интересная проблема дизайна. Я работаю над SLES 9+ Linux, ядром 2.6+, и у меня есть многопоточное приложение, выступающее в качестве клиента RPC. Идея состоит в том, чтобы иметь несколько потоков для обработки запросов; один из таких запросов - запустить «задание» в качестве дочернего процесса.

Теперь проблема, с которой я столкнулся, состоит в том, чтобы настроить надлежащий обработчик сигналов для работы с различными сигналами.Я создал еще один поток для обработки сигналов, находящийся в состоянии sigwait () , при этом блокируя все соответствующие сигналы в других потоках. Идея состоит в том, что все сигналы для процесса должны быть доставлены в поток обработки сигналов, а остальные потоки должны беспокоиться только об обработке запросов по мере их поступления.

Все это отлично работает, за исключением тех гнилых потомков, которые всегда бросают их фрисби у меня на заднем дворе и топчут всю мою лужайку ... но если серьезно, мой поток обработки сигналов не получает сигнал SIGCHLD. Мое лучшее предположение относительно того, что здесь происходит, заключается в том, что, поскольку поток обработки сигналов не является потоком, породившим дочерний элемент, это будет не поток, который получает SIGCHLD, а вместо этого мои рабочие потоки, которые это сделали.

Итак, что касается моих вопросов:

  1. Я без ума от того, что SIGCHLD не попадает в мой поток обработчика сигналов?
  2. Если я не сумасшедший (это натянуто, я знаю), как бы вы исправили это? маленькая проблема? В настоящее время я устанавливаю очень простой обработчик сигналов для SIGCHLD, настроенный для всех потоков, который просто повторно отправляет сигнал как сигнал SIGUSR2 группе процессов, которая заблокирована во всех потоках, позволяющих потоку обработки сигналов. Этот кажется работает, однако я не могу избавиться от мысли, что либо я что-то упускаю, ЛИБО есть лучший способ справиться с этим ... он, он, поймите, обработать это ... хорошо, я остановлюсь сейчас

Согласно запросу Дэвида Шварца SLES9: NPTL 2.3.5, SLES10: NPTL2.4

6
задан Bob9630 15 November 2011 в 18:49
поделиться