5

vfork()システムコールを使用して作成された新しいプロセスが親のアドレス空間でスレッドとして実行され、子スレッドがexit()またはexec()システムコールを呼び出さなくなるまで、親がブロックされることを読みました。そこで、vfork()システムコールを使用してプログラムを作成しました

#include <stdio.h>  
#include <unistd.h>

int main()  
 {  
      pid_t pid;  
      printf("Parent\n");  
      pid = vfork();  
      if(pid==0)  
      {  
          printf("Child\n");  
      }  
      return 0;  
  }

次のような出力が得られました。

 Parent  
 Child  
 Parent  
 Child  
 Parent  
 Child  
 ....  
 ....  
 ....

returnステートメントはexit()システム呼び出しを内部的に呼び出す必要があると想定していたので、出力は次のようにのみ期待していました。

Parent  
Child

なぜ実際にそれが停止せず、無限ループで継続的に印刷されないのか、誰かが私に説明できますか?

4

1 に答える 1

5

マニュアルページをvfork注意深く読む必要があります。

vfork()関数はfork(2)と同じ効果がありますが、vfork()によって作成されたプロセスが、vfork()からの戻り値を格納するために使用されるpid_t型の変数以外のデータを変更する場合の動作が未定義である点が異なります。 、またはvfork()が呼び出された関数から戻るか、_exit(2)またはexec(3)ファミリーの関数の1つを正常に呼び出す前に他の関数を呼び出します。

(上記はマニュアルページのPOSIX部分からのものであるため、Linux以外の環境に(潜在的に)適用されます)。

あなたはprintf子供から電話をかけて戻ってきているので、あなたのプログラムの振る舞いは定義されていません。

于 2011-05-20T12:15:08.950 に答える