Когда системный вызов возвращает ошибку (например, когда waitpid
возвращает -1
), обратитесь к errno
(обычно через perror
), если вам необходимо определить, какая ошибка произошла.
Согласно до man 2 waitpid
в моей системе возможные ошибки довольно ограничены:
ECHILD
: процесс, указанный в pid, не существует или не является дочерним по отношению к вызывающему процессу. (Это может произойти для собственного потомка, если для SIGCHLD
установлено значение SIG_IGN.
См. Также раздел Linux Примечания о потоках.)
EINTR
: WNOHANG
не был установлен, и был разблокирован сигнал или SIGCHLD
; см. сигнал (7).
EINVAL
: Аргумент параметров недействителен.
Кроме того, EFAULT
может быть возвращено, если вы передать неверный адрес для второго аргумента. Похоже, что дело в том, что код, который вы использовали, был использован. [1]
waitpid(-1,status,0)
должно быть
waitpid(-1,&status,0)
Если вы ошиблись или если вы После устранения этой проблемы по-прежнему возникает ошибка:
- У процесса нет дочерних элементов. Любые дочерние элементы, которые он мог создать, уже были собраны.
- Вы настроили обработчик сигнала, и сигнал поступил, пока вы ожидали завершения дочернего процесса. Просто позвоните
waitpid
еще раз.
- ВСЕГДА включайте предупреждения вашего компилятора и обрабатывайте их, как если бы они были ошибками! С
gcc
я использую -Wall -Wextra -pedantic
.