Представьте, что у меня есть процесс, который запускает несколько дочерних процессов. Родитель должен знать, когда ребенок выходит.
Я могу использовать waitpid
, но тогда, если / когда родитель должен выйти, я не могу сказать потоку, который заблокирован в waitpid
, чтобы выйти изящно и присоединиться к нему. Приятно, чтобы вещи сами убирались, но это может быть не так уж важно.
Я могу использовать waitpid
с WNOHANG
, а затем поспать в течение некоторого произвольного времени, чтобы предотвратить занятое ожидание. Однако тогда я могу только знать, выходил ли ребенок так часто. В моем случае, может быть, не очень важно, чтобы я знал, когда ребенок сразу же выходит, но я хотел бы знать как можно скорее ...
Я могу использовать обработчик сигнала для SIGCHLD
, а в обработчике сигнала делать то, что я собирался делать при выходе из дочернего процесса, или отправлять сообщение в другой поток, чтобы выполнить какое-либо действие. Но использование обработчика сигнала немного запутывает поток кода.
Что я действительно хотел бы сделать, так это использовать waitpid
в течение некоторого времени ожидания, скажем, 5 секунд. Поскольку выход из процесса не является критичной ко времени операцией, я могу лениво дать сигнал потоку на выход, в то же время оставляя его заблокированным в waitpid
, всегда готовым реагировать. Есть ли такой вызов в Linux? Какой из вариантов лучше?
EDIT:
Другой метод, основанный на ответах, заключается в блокировке SIGCHLD
во всех потоках с pthread
\ _sigmask()
. Затем в одном потоке продолжайте звонить sigtimedwait()
, ища SIGCHLD
. Это означает, что я могу установить тайм-аут на этот вызов и проверить, должен ли поток завершиться и, если нет, остаться заблокированным в ожидании сигнала. Как только SIGCHLD
доставляется в этот поток, мы можем немедленно реагировать на него и в очереди потока ожидания, не используя обработчик сигнала.