6

子プロセス ブロックの親 pid 値と混同されました。私のプログラムは以下のとおりです。

 int main(int argc, char *argv[])
  {
    pid_t pid;
    pid=fork();
    if(pid==-1){
            perror("fork failure");
            exit(EXIT_FAILURE);
    }
    else if(pid==0){
            printf("pid in child=%d and parent=%d\n",getpid(),getppid()); 
    }
    else{
            printf("pid in parent=%d and childid=%d\n",getpid(),pid);
    }
    exit(EXIT_SUCCESS);
  }

出力: parent=2642 および childid=2643 の pid

child=2643 および parent=1 の pid

「高度な Unix プログラミング」では、子プロセスは getppid() 関数を使用して親プロセス ID を取得できると書かれています。しかし、ここでは「init」プロセス ID である「1」を取得しています。

子プロセス ブロックで親の pid 値を取得するにはどうすればよいですか。出力の取得を手伝ってください。

「Linux Mint OS」で実行しましたが、「WindRiver」OS ではこの問題は発生しません。このプログラムは OS によって動作が変わりますか?

4

5 に答える 5

6

それは、父親が息子よりも先に出られる/出るからです。子の戻り値を要求せずに親が存在する場合、子は pid=1 のプロセスによって所有されます。古典的な UNIX または GNU システムにあるもの SystemV init.

waitpid()解決策は、父親で使用することです:

int main(int argc, char *argv[])
{
    pid_t pid;
    pid=fork();
    if(pid==-1){
        perror("fork failure");
        exit(EXIT_FAILURE);
    }
    else if(pid==0){
        printf("pid in child=%d and parent=%d\n",getpid(),getppid()); 
    }
    else{
        printf("pid in parent=%d and childid=%d\n",getpid(),pid);
    }

    int status = -1;
    waitpid(pid, &status, WEXITED);

    printf("The child exited with return code %d\n", status);
    exit(EXIT_SUCCESS);
}
于 2013-08-09T19:35:58.837 に答える
0

フォークの後、2 つの新しいプロセスがあり、親の子 ID を知ることができますが、その逆はわかりません。これが本当に必要な場合は、フォークの前にパイプを開く (popen) 必要があります。その後、親はこれをパイプに書き込み、子はそれを読み取ることができます。

于 2013-08-09T19:35:46.140 に答える
0

親が実行を完了すると、子はまだ実行されています。次に、子は孤児として知られ(親が死亡したため)、root(pid = 1)でログインしている場合、initプロセスによって採用されます。

親の前に子を最初に終了させたい場合は、wait() システムコールとそのバリアントを使用します。

于 2017-03-26T17:52:59.957 に答える