Были проблемы с пониманием и применением существующих ответов.
В ответе AraK , если в приложении запущено более одного дочернего процесса, невозможно узнать, какой конкретный дочерний процесс выдал полученный статус выхода. Согласно справочной странице,
wait () и waitpid ()
Системный вызов wait () приостанавливает выполнение вызывающего процесса до тех пор, пока один из его дочерних элементов не завершит . Ожидание вызова (и статус)
эквивалентно:
waitpid(-1, &status, 0);
The **waitpid()** system call suspends execution of the calling process until a **child specified by pid** argument has changed state.
Итак, чтобы получить статус завершения определенного дочернего процесса, мы должны переписать ответ следующим образом:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
int number, statval;
int child_pid;
printf("%d: I'm the parent !\n", getpid());
child_pid = fork();
if(child_pid == -1)
{
printf("could not fork! \n");
exit( 1 );
}
else if(child_pid == 0)
{
execl("/bin/ping", "/bin/ping" , "-c", "1", "-t", "1", ip_addr, NULL);
}
else
{
printf("PID %d: waiting for child\n", getpid());
waitpid( child_pid, &statval, WUNTRACED
#ifdef WCONTINUED /* Not all implementations support this */
| WCONTINUED
#endif
);
if(WIFEXITED(statval))
printf("Child's exit code %d\n", WEXITSTATUS(statval));
else
printf("Child did not terminate with exit\n");
}
return 0;
}
Не стесняйтесь превратить этот ответ в правку ответа Арака.