C言語のfork()について・・・

C言語のfork()について・・・ #include<stdio.h> #include<unistd.h> #include<strings.h> #define ERR -1 int main(int argc,char *argv[]) { int pid; int status; if( (pid=fork()) ==0){ printf("C PID=%d parent=%d\n",getpid(),getppid()); } else if(pid == ERR){ perror("fork"); exit(1); } else if(pid >= 1){ pid = wait(&status); printf("P child PID = %d status = %x\n",pid,status); } } このプログラムについてなのですが・・ forkで子プロセスを作り、 その戻り値をpidに代入してる if( (pid=fork()) ==0) この部分でpid=0になったと思うのですが、 その後、pidの値をいじっていないのに else if(pid >= 1) この処理も実行されています。 これはfork()を使った結果、 pidに親と子を識別する2つの値が入っている という事で宜しいのでしょうか?

C言語関連408閲覧xmlns="http://www.w3.org/2000/svg">25

ベストアンサー

0

>pidに親と子を識別する2つの値が入っている >という事で宜しいのでしょうか? 少し違います if( (pid=fork()) ==0){ この一文を実行した時点から、int main(){}の中の全てのプログラムがコピーされて別プロセスとして実行されています。 その際の実行スタート地点は、forkした箇所です。 なので、pidが2つになって、それぞれに親のPIDと子のPIDが入っている、ということです

ThanksImg質問者からのお礼コメント

pid自体がfork()でコピーされて2つできていてそれぞれに親と子のpidが入っているということだったんですか! とても分かりやすい説明でした。ありがとうございます。 お二方もありがとうございました。

お礼日時:2013/5/26 0:11

その他の回答(2件)

0

forkが呼び出されると呼び出し側プロセスにほぼ瞬時に 戻ります。 しかし子プロセスが実際に開始するのは、親プロセスからみて forkの中かもしれませんしforkから 親プロセスに戻った後かもしれません。 forkから親プロセスに戻る前に子プロセスは終了 してしまうかもしれません。 子プロセスと親プロセスの標準入出力は共有されます。 しかもOSによってバッファされるので、出力順序は 実際のprintfなどがシステムコールされた時間的順序とは 異なる可能性があります。 else if (pid>=1)を実行したのは親プロセスですが 出力の状況によっては、子プロセスが行ったように 見えるかも知れません。 printfの後にはfflush(stdout)を入れるようにし (親プロセスでも)getpid()の戻り値をprintfの際に同時に 出力して、どちらのプロセスの出力なのかわかりやすくして もう一度確かめてみてください。

0

sdvmaaaさん forkで子プロセスを作り、 その戻り値をpidに代入してる if( (pid=fork()) ==0) この部分でpid=0になったと思うのですが、(なっていない) pid=fork()代入して、 if(pid==0)ただの比較