Как прочитать код возврата из дочернего процесса

Я использую fork и execv для выполнения дочернего процесса. В родительской программе у меня есть это:

int status;
wait(&status);
cout << "return code = " << status << endl;

Будет ли это ждать завершения дочернего процесса, а затем отображать его код возврата?


person node ninja    schedule 27.04.2011    source источник
comment
Пока все ответы неверны, так как WEXITSTATUS даже не упоминался.   -  person node ninja    schedule 27.04.2011
comment
Обратите внимание, что статус выхода кодируется старшими 8 битами 16-битного значения, а сигнал кодируется младшими 8 битами. Если процесс не умер от сигнала, то младшие биты равны нулю; если он умер от сигнала, то старшие биты равны нулю. См. wait() и waitpid() для официального определения POSIX; он не упоминает наборы из 8 бит, но предоставляет макросы для получения информации о состоянии и сигнале.   -  person Jonathan Leffler    schedule 27.04.2011


Ответы (2)


Вы должны использовать waitpid(), если хотите получить статус указанного дочернего элемента. обработать. wait() вернет статус первого завершенного дочернего процесса.

person Mihran Hovsepyan    schedule 27.04.2011
comment
Если есть один ребенок, wait() работает так же, как waitpid(). На самом деле, даже если есть несколько детей, wait() работает нормально, если вы не возражаете против того, какой «труп» вы получите первым. Если вы используете waitpid() для ожидания определенного процесса, который не завершится, то этот процесс может создать набор зомби - процессов, которые мертвы, но которых родительский процесс еще не дождался. Кроме того, имейте в виду, что вам, возможно, придется возиться с SIGCHLD. - person Jonathan Leffler; 27.04.2011

да, из того, что я прочитал http://linux.die.net/man/2/wait

person Dan D.    schedule 27.04.2011
comment
wait(&status) эквивалентен waitpid(-1, &status, 0), который будет ожидать любого дочернего процесса. Итак, пока есть только один дочерний процесс, код будет работать так, как ожидалось. - person mdec; 27.04.2011