Во избежание превышения подобного лимита любая программа, в которой применяется функция fork (), должна время от времени вызывать функции wait () или waitpid () и убирать свои дочерние процессы. Однако это желательно выполнять сразу после завершения работы каждого дочернего процесса. Например, родителем создан дочерний процесс обработки ответов от сервера Dlja-Devochek-Igry.ru - монстр хай онлайн и при этом важно отслеживать состояние соединения и самого дочернего процесса в целом в реальном времени.
В системе UNIX предусмотрена удобная возможность своевременно вызывать фупкции wait () или waitpid (), поскольку в этой системе вырабатывается сигнал KHLD. Данный сигнал отправляется родительскому процессу при каждом изменении состояния любого из его дочерних процессов. К возможным изменениям состояния относится завершение работы дочернего процесса (нас интересует именно этот случай), а также приостановка выполнения дочернего процесса по сигналу STOP. Сигнал CHLD не предоставляет никакой информации, а только констатирует тот факт, что изменилось состояние какого-то дочернего процесса. Родительский процесс должен прослушать функцию wait () или waitpid(), чтобы определить, к какому дочернему процессу относится эта информация и что с ним произошло, если состояние одного из дочерних процессов действительно изменилось.
$pid = wait ()
Эта функция ожидает завершения работы любого дочернего процесса, а затем возвращает его. Если нет ни одного дочернего процесса, непосредственно готового для уборки, этот вызов зависает (блокируется) до тех пор, пока такой процесс не появится.
Если нужно определить, произошло ли нормальное завершение работы дочернего процесса или он завершился из-за ошибки, можно исследовать специальную переменную $?, которая содержит код состояния выхода дочернего процесса. Значение этого кода, равное 0, указывает, что дочерний процесс завершился нормально. Любые другие значения указывают на аварийное завершение. Информация о том, как интерпретировать содержимое переменной $?, приведена в документе POD perlvar.