出力に予期しない親プロセスIDがあります。

出力に予期しない親プロセスIDがあります。

私のコードはプロセスを分岐し、各プロセスのPIDとPPIDを印刷します。私は子供のPPIDが親のPIDと同じであると予想しましたが、そうではありませんでした。

Ubuntu 14.04を使用しています。

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

int main(){
    int pid;
    pid = fork();
    if(pid==0){
        printf("\nI am the child and my parent id is %d and my id %d\n", getppid(), getpid());
    }
    else
        printf("\nI am the parent and my pid is %d and my parent id is %d\n", getpid(), getppid());

    return 0;
}

これは私が得た結果です。

I am the parent and my pid is 29229 and my parent id is 27087
I am the child and my parent id is 1135 and my id is 29230

ベストアンサー1

私の考えでは、親プロセスは子プロセスよりも先に返され、子プロセスは孤児プロセスになります。 PID 1135は、このプロセスの新しい親であるユーザー初期化プロセスでなければなりません。 (Ubuntuユーザーセッションには2つのサブハーベスタがあります)。

$ ps -ef | grep init
you    1135    ...    init --user

親が子供を待つようにするために使用しますwait。実際には以下がincludeすでにあります。

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

int main(){
    int pid;
    pid = fork();
    if(pid == 0)
        printf("\nI am the child and my parent id is - %d and mine id %d\n",getppid(),getpid());
    else{
       printf("\nI am the parent and my pid is %d and my parent id is %d\n",getpid(),getppid());
       wait(NULL);
    }
    return 0;
}

これにより、親プロセスは子プロセスの前に終了しませんprintf。ここにいくつかの呼び出しを挿入して状況が発生する順序を確認すると、sleep()この動作をより明確に表示できます。

収穫期の詳細はねえ

おすすめ記事