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