web-dev-qa-db-ja.com

Cでの待機の使用方法

waitを使用するにはどうすればよいですか?それは私に終わりを告げるだけです。再帰を伴うprocのツリーをforkし、pstreeを実行している間、procツリーを印刷できるように、子は一時停止(待機/スリープ)する必要があります。

私は使うべきですか

_int status;
wait(&status);
_

というより

_wait(NULL)
_

これをどこに置けばいいですか?親のif(pid > 0)または子のif(pid==0)?多分ifsの終わりにあるので、すべてのpidsを配列に格納してから、それらに対してforを実行し、待機を使用しますか?

私のコードテンプレート:

_void ProcRec(int index)
{
     pid_t pid;
     int noChild = getNChild(index);

     int i= 0;
     for(i = 0; i < noChild; i++)
     { 
          pid = fork();

        if (pid > 0)
        {
            /* parent process */
        }
        else if (pid == 0)
        {
            /* child process. */
            createProc(index+1);
        }
        else
        {
            /* error */
            exit(EXIT_FAILURE);
        }
    }

    if(getpid() == root)
    {
        sleep(1); 
        pid = fork();
        if(pid == 0)
          execl("/usr/bin/pstree", "pstree", getppid(), 0);    
    }
}
_

wait システムコールはプロセスをスリープ状態にし、子プロセスが終了するのを待ちます。次に、引数に子プロセスの終了コードを入力します(引数がNULLでない場合)。

したがって、親プロセスにある場合

_int status;
if (wait(&status) >= 0)
{
    if (WEXITED(status))
    {
        /* Child process exited normally, through `return` or `exit` */
        printf("Child process exited with %d status\n", WEXITSTATUS(status));
    }
}
_

子プロセスでは、たとえばexit(1)の場合、上記のコードが出力されます

子プロセスは1つのステータスで終了しました

また、すべての子プロセスを待つことが重要であることにも注意してください。待機しない子プロセスは、親プロセスがまだ実行されている間、いわゆるゾンビ状態になり、親プロセスが終了すると、子プロセスは孤立し、プロセス1の子になります。

11