2016-06-30 1 views
2

以下のサンプルコードは、linuxのマニュアルページwaitpid関数のものです。 elseで置き換えられた場合、最後のelseは可能ですか?私はコードを書くとき、私は次のように書く:if、else if、elseで終わる。だから私はそれがサンプルコードでは奇妙だと思う。waitpidの目的は何ですか

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

    int 
    main(int argc, char *argv[]) 
    { 
     pid_t cpid, w; 
     int status; 

     cpid = fork(); 
     if (cpid == -1) { 
      perror("fork"); 
      exit(EXIT_FAILURE); 
     } 

     if (cpid == 0) {   /* Code executed by child */ 
      printf("Child PID is %ld\n", (long) getpid()); 
      if (argc == 1) 
       pause();     /* Wait for signals */ 
      _exit(atoi(argv[1])); 

     } else {     /* Code executed by parent */ 
      do { 
       w = waitpid(cpid, &status, WUNTRACED | WCONTINUED); 
       if (w == -1) { 
        perror("waitpid"); 
        exit(EXIT_FAILURE); 
       } 

       if (WIFEXITED(status)) { 
        printf("exited, status=%d\n", WEXITSTATUS(status)); 
       } else if (WIFSIGNALED(status)) { 
        printf("killed by signal %d\n", WTERMSIG(status)); 
       } else if (WIFSTOPPED(status)) { 
        printf("stopped by signal %d\n", WSTOPSIG(status)); 
       } else if (WIFCONTINUED(status)) { /* can this be 
                *replaced with else ??? 
                */ 
        printf("continued\n"); 
       } 
      } while (!WIFEXITED(status) && !WIFSIGNALED(status)); 
      exit(EXIT_SUCCESS); 
     } 
    } 

答えて

1

ここで質問私はあなたが求めていると思うのです:

それはwaitpidstatusよう のどれもWIFEXITED(status)WIFSIGNALED(status)WIFSTOPPED(status)、または WIFCONTINUED(status)リターンゼロ以外を返すことは可能ですか?

答えはほぼ確実に「ノー」であり、Linux man pageは、(残念ながら)それを明示的に言っているわけではありません。

UNIX標準では、さらにhereと記載されています。これらのマクロの1つが特定の場合に非ゼロを返すことを特に保証しています。しかし、Linuxは(必然的に)この規格に準拠しているわけではありません。

しかし、私はコード内の最適なソリューションは、これらの4つのオプションの後にelse句を持っている、と(自分のアプリケーションに応じて)の状態が不明であることを意味するためにこれを取ることであろうと思います。これは、今の場合であっても起こる可能性があります。Linuxの将来のバージョンでは、ここで扱われていない別の種類の終了条件があり、このような場合にコードがクラッシュすることは望ましくありません。

標準は時間の経過とともに進化したようです。たとえば、以前のバージョンにはWIFCONTINUEDのケースがなく、他のシステムではWIFCOREDというオンラインの参考文献もいくつか見つかりました。あなたがそれについて心配しているなら、あなたのコードを柔軟にすることは良いでしょう。

関連する問題