2017-02-12 11 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は子供に子どもがいない(ECHILD)のでエラーを返します(statusに触れていません)。そして、未初期化値であるstatusをテストしています。

変更:

else if (pid == 0) 

へ:

else if (pid > 0) 

と期待どおりに動作するはずです。

関連する問題