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