この例を見ると
#include <stdio.h>
#include <unistd.h>
void main(){
int pi_d ;
int pid ;
pi_d = fork();
if(pi_d == 0){
printf("Child Process B:\npid :%d\nppid:%d\n",getpid(),getppid());
}
if(pi_d > 0){
pid = fork();
if(pid > 0){
printf("\nParent Process:\npid:%d\nppid :%d\n",getpid(),getppid());
}
else if(pid == 0){
printf("Child Process A:\npid :%d\nppid:%d\n",getpid(),getppid());
}
}
}
私にとって、これはプロセスを分岐すると親プロセスのコピーが作成されるため、プロセスを無限に生成するようです。このようにしてプログラムコードが複製される。
これは、それぞれの新しいプロセスが同じコードを実行するためなどをpi_d = fork()
呼び出すことを意味します。
私がここで何を見逃しているのでしょうか?
答え1
から引用POSIX フォーク定義(太い強調内):
戻り値
正常に完了すると、fork()は子プロセスに0を返し、親プロセスに子プロセスのプロセスIDを返します。
fork()
どちらのプロセスもこの関数で実行し続ける必要があります。。それ以外の場合、-1は親プロセスに返され、子プロセスは生成されず、errno
エラーを示すように設定する必要があります。
OPは次のように書きました。
これは、すべての新しいプロセスに対して同じコードを実行することを意味します。
無事に終えてfork()
帰ってきた後両親と子供はすぐに回復しますfork()
:最初の項目は再実行されずfork()
、最初または2番目の項目も再実行されません。fork()
このコードには、このようなことを起こすループがないためです。
エラーが発生しなかったとします(検査なし)。
- 親フォーク
- サブモニタの場合
Child Process B
。 - そうではなく、両親なら再びフォークしてください。
- (再)親の場合は表示
Parent Process
- 親の2番目の子の場合は、次のようになります。
Child Process A
- (再)親の場合は表示
- サブモニタの場合
3つの出力は、任意の順序または混合で発生する可能性があります(ただし、特定のオペレーティングシステムでは、1つの表示順序が他のものよりも大きくなければなりません)。 )。表示順序がより頻繁に発生し、Child Process B
リードがある順序が最初に表示されることがあります。