Всякий раз, когда происходит выход из процесса (независимо от того, вызывается ли он _exit (int Exit_Status)), ядро отправляет функцию SIGCHLD своему родителю.родитель может либо
1. Ignore the incoming signal
2. Catch it by installing a signal handler
В частности, родитель может поймать состояние выхода, вызвав функцию wait () или waitpid ().В этом случае LSB делается доступным для родителя.В частности, статус может быть изучен следующим образом:
int status;
wpid = waitpid(child_pid, &status, WUNTRACED);
Поскольку доступны только последние 8 битов, будет логично замаскировать старший бит, выполнив битовую операцию и операцию с 255. Определенный системой макрос делает это дляyou
WEXITSTATUS(status);
Таким образом, чтобы получить дочерний статус - вы можете использовать после оператора waitpid
printf("child exited, status=%d\n", WEXITSTATUS(status));
Игнорирование SIGCHLD может привести к созданию процесса зомби (несуществующего)).Установка флага SA_NOCLDWAIT для SIGCHLD не создает зомби, поскольку ядро их пожинает.Однако код не переносим, и лучше использовать системный вызов wait.