web-dev-qa-db-ja.com

getpidとgetppidは2つの異なる値を返します

以下のコードを実行すると

#include <stdio.h>
#include <sys/types.h>
//int i=0;
int main(){

int id ;
id = fork() ;
printf("id value : %d\n",id);
    if ( id == 0 )
    {
    printf ( "Child : Hello I am the child process\n");
    printf ( "Child : Child’s PID: %d\n", getpid());
    printf ( "Child : Parent’s PID: %d\n", getppid());
    }
    else
    {
    printf ( "Parent : Hello I am the parent process\n" ) ;
    printf ( "Parent : Parent’s PID: %d\n", getpid());
    printf ( "Parent : Child’s PID: %d\n", id);
    } 

}

私の出力は

id value : 20173
Parent : Hello I am the parent process
Parent : Parent’s PID: 20172
Parent : Child’s PID: 20173
id value : 0
Child : Hello I am the child process
Child : Child’s PID: 20173
Child : Parent’s PID: 1

親のPID(20172)と子の親のID(1)との違いは何ですか?これら2つは等しくないはずですか?

16
Assasins

起こっているのは、子が実行される前に親が終了していることです。これにより、子は孤立したままになり、PIDが1のルートプロセスによって採用されます。親を終了させるのではなく、標準入力から遅延またはデータを読み取ると、期待する結果が表示されます。

プロセスID 1は通常、主にシステムの起動とシャットダウンを担当するinitプロセスです。 init(初期化の略)は、他のすべてのプロセスの直接または間接の祖先であるデーモンプロセスです。 initのwikiリンク

User314104が指摘しているように、wait()およびwaitpid()関数は、子プロセスの状態が変化するまで親プロセスが自身を一時停止できるように設計されています。したがって、ifステートメントの親ブランチでwait()を呼び出すと、親は子が終了するまで待機します。

24
Jackson

親プロセスが実行されて解放されるため、その子プロセスは孤立し、pidが1であるinit(初期化の略)は孤立プロセスを受け取りました。

0
Stone.Carton