C - При каких условиях вызов waitpid() вернет -1, сигнализируя об ошибке?
Я пишу обработчик SIGCHLD, и мне интересно, при каких условиях вызов waitpid() вернет -1?
Более конкретно, если я создаю цикл, в котором я вызываю waitpid(...) и хочу, чтобы он выполнялся до тех пор, пока не будут собраны все завершенные дочерние процессы, буду ли я выполнять итерацию до тех пор, пока waitpid(...) не вернет -1? В противном случае, как я могу узнать, есть ли еще дети, которым нужно пожинать плоды?
1 ответ
Решение
waitpid()
может вернуться -1
при этих обстоятельствах:
- У процесса нет детей, которых он еще не ждал.
errno
установлен вECHILD
в этом случае. Если вы зацикливаетесь на том, чтобы пожать всех детей или всех детей в вашей группе процессов (т.е. вы установилиpid
в-1
или же0
), вы должны выйти из цикла, когда это произойдет. Это также может произойти, если действие сигнала дляSIGCHLD
установлен вSIG_IGN
илиSA_NOCLDWAIT
флаг установлен для сигнала. - Проблема была обнаружена в аргументах. Если проблема с
options
аргумент,errno
будет установлен вEINVAL
, Еслиpid
больше, чем0
(так что вы ждете конкретного ребенка) и не существует или не является дочерним процессом этого процесса,errno
будет установлен вECHILD
; это, вероятно, не применимо, если вы находитесь в цикле ожидания. Как правило, они указывают на проблему в вашем коде, вы, вероятно, должны сообщить об этом или зарегистрировать ее и выйти. - Звонок был прерван сигналом.
errno
будет установлен вEINTR
, Вы, вероятно, должны оставаться в курсе, когда это произойдет.