16

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

#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つは等しくないはずですか?

4

2 に答える 2

24

何が起こっているのかというと、子が走る前に親が終了しているということです。これにより、子は孤立したままになり、PIDが1のルートプロセスに採用されます。親を終了させるのではなく、遅延を設定するか、stdinからデータを読み取ると、期待どおりの結果が得られます。

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

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

于 2013-03-03T07:28:41.987 に答える
0

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

于 2016-04-19T07:13:52.880 に答える