1. ホーム
  2. c

[解決済み] C言語でのwaitの使い方

2022-03-02 11:03:14

質問

を使用するにはどうすればよいのでしょうか? wait ? という疑問が湧いてきます。I fork 再帰を持つプロックのツリーで、私がpstreeを実行する間、子プロックは一時停止(待機/スリープ)しなければならず、私はプロックツリーを印刷することができます。

を使用する必要があります。

int status;
wait(&status);

というか

wait(NULL)

これはどこに書けばいいのでしょうか? if(pid > 0) または子 if(pid==0) ? ifの末尾にあるかもしれないので、すべての pid を配列に格納し、その上で for を実行し、waitを使用しますか?

私のコードテンプレートです。

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の子になります。