6

以下のコードを考慮してください:

int main()
{
  int pid;
  pid=vfork();
  if(pid==0)
     printf("child\n");
  else
     printf("parent\n");
  return 0;
  }

vfork()の場合、親プロセスと子プロセスが使用するアドレス空間は同じであるため、変数 pid の単一のコピーがそこにあるはずです。この pid 変数がvfork()によって返される 2 つの値を持つ方法を理解できません。

fork()の場合、アドレス空間もコピーされ、各子と親に pid 変数の 2 つのコピーがあるため、この場合、2 つの異なるコピーがfork()によって異なる値を返す可能性があることは理解できますが、理解できません。 vfork()の場合、どのように pid がvfork()によって返される 2 つの値を持ちますか?

4

1 に答える 1

6

2冊はありません。あなたvforkが呼び出すと、子がそのことをしている間(_exit(2)またはを呼び出すまでexecve(2))、親がフリーズします。pidしたがって、どの時点でも変数は 1 つしかありません。

補足として、あなたがしていることは安全ではありません。標準はそれを明確に綴ります:

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

2 つ目の注意点として、vforkは から削除されましSUSv4た。これを使用しても意味がありません。

于 2012-02-19T09:06:05.293 に答える