waitpidは、すでに終了している子プロセスの有効なステータス情報を生成しますか?

StackOverflow https://stackoverflow.com/questions/2865640

  •  30-09-2019
  •  | 
  •  

質問

もし私が fork 子のプロセス、および親が電話する前に子プロセスが終了する waitpid, 、次に、によって設定されている出口ステータス情報です waitpid まだ有効?もしそうなら、いつ無効になりますか。すなわち、どうすれば電話してもらうことができますか waitpid 子供のPIDで、任意の時間の後に有効な出口ステータス情報を取得し続けます。また、どのようにして「クリーンアップ」しますか(完成した子プロセスの出口ステータス情報にはもう興味がないことをOSに伝えます)?

私は次のコードをいっぱいにしていましたが、出口ステータス情報は子供が終了してから少なくとも数秒間有効であるように見えますが、私はどのくらいの期間、またはOSに通知する方法を知りません電話 waitpid また:

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

int main()
{
    pid_t pid = fork();

    if (pid < 0) {
        fprintf(stderr, "Failed to fork\n");
        return EXIT_FAILURE;
    }
    else if (pid == 0) { // code for child process
        _exit(17);
    }
    else { // code for parent
        sleep(3);

        int status;
        waitpid(pid, &status, 0);
        waitpid(pid, &status, 0); // call `waitpid` again just to see if the first call had an effect
        assert(WIFEXITED(status));
        assert(WEXITSTATUS(status) == 17);
    }

    return EXIT_SUCCESS;
}
役に立ちましたか?

解決

はい、 waitpid 子供が出た後に機能します。 OSは、親が呼び出すまで、プロセステーブル(出口ステータスを含む)に子プロセスのエントリを保持します waitpid (または別の wait- 家族機能)または親が出るまで(その時点でステータスが収集される init 処理する)。これが「ゾンビ」プロセスです。退出したプロセスは、まさにこの目的のためにプロセステーブルにまだ居住しています。

テーブル内のプロセスのエントリは、最初の呼び出しの後に消える必要があります waitpid. 。私はあなたの例であなたが呼ぶことができるように見える理由を疑っています waitpid 2回は単に理由です waitpid 変更しません status 議論の場合 pid もはや存在しない。したがって、最初の呼び出しは機能し、埋める必要があります status, 、そして2番目の呼び出しはエラーコードを返すことであり、変更しないでください status. 。これを確認できます。 waitpid 2つの異なる呼び出しおよび/または使用 status 変数。

他のヒント

OSは、aに終了したプロセスを保持します ゾンビ州 その親まで(これはそうかもしれません init 元の親プロセスが以前に終了した場合) wait(2) システムコール。答えは - プロセスの出口ステータスです 無効になりません.

はい。

から 男ページ:

終了したが、待たれていない子供は「ゾンビ」になります。カーネルは、親が後で子供に関する情報を取得するのを待つことを可能にするために、ゾンビプロセス(PID、終了ステータス、リソース使用情報)に関する最小限の情報セットを維持します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top