2017-02-12 2 views
0

У меня есть эта простая программа, которая создает дочерний процесс, который сразу вызывает exit(). Поэтому в родительском процессе я ожидаю, что WIFEXITED(status) будет оцениваться как true, но это не так. Вместо этого WIFSTOPPED(status) оценивается как true и печатается «остановлена». Может ли кто-нибудь объяснить, почему я получаю такое поведение? Я работаю на OS X и компилирую с gcc. Благодаря!Почему WIFEXITED возвращает false после завершения дочернего процесса?

#include <unistd.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <sys/wait.h> 

int main(void) 
{ 
    int pid; 
    int status; 

    pid = fork(); 
    if (pid < 0) 
     printf("fork failed\n"); 
    else if (pid == 0) 
    { 
     wait(&status); 
     if (WIFEXITED(status)) 
      printf("exited\n"); 
     else if (WIFSTOPPED(status)) 
      printf("stopped\n"); 
    } 
    else 
     exit(0); 

    return (0); 
} 

ответ

4

У вас есть логика для ребенка и родителя назад. Родитель немедленно выйдет, и ребенок вызывает wait. Поскольку у ребенка нет детей, wait возвращает ошибку (и не касается status), так как у ребенка нет детей (ECHILD), то вы тестируете (неинициализированное) значение status и действуете на него, что приводит к неопределенному поведению.

Изменение:

else if (pid == 0) 

к:

else if (pid > 0) 

и он должен работать, как ожидалось.

Смежные вопросы