C - При каких условиях вызов waitpid() вернет -1, сигнализируя об ошибке?

Я пишу обработчик SIGCHLD, и мне интересно, при каких условиях вызов waitpid() вернет -1?

Более конкретно, если я создаю цикл, в котором я вызываю waitpid(...) и хочу, чтобы он выполнялся до тех пор, пока не будут собраны все завершенные дочерние процессы, буду ли я выполнять итерацию до тех пор, пока waitpid(...) не вернет -1? В противном случае, как я могу узнать, есть ли еще дети, которым нужно пожинать плоды?

1 ответ

Решение

waitpid() может вернуться -1 при этих обстоятельствах:

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