Хотя верно, что SIGCHLD, waitpid
и т. Д. Работают только для непосредственных детей, в системах UNIX часто можно немного «обмануть» унаследованные ресурсы, переданные от родителя к потомку внуку и закрытые при обработке.завершение.
Например, исходный процесс может открыть pipe
и, возможно, установить чтение конец его close-on-exec , так что дети и внуки наследуют конец записи.Когда исходный процесс готов ждать завершения всех потомков, он закрывает конец записи канала и блокирует read
с или select
с для читаемости оставшегося дескриптора.Когда последний потомок завершит свою работу, конец канала чтения прочитает EOF.
Эта тактика не гарантируется - ребенок или внук могут осторожно закрыть унаследованные файловые дескрипторы - но часто это работает достаточно хорошо.