2012-02-19 11 views
6

は、以下のコードを考慮した値そこにいるはずです。今、私はこのPID変数は、によって返された2つの値を持つことができない理解するvfo​​rk()すなわち、子供のためのゼロと親のための非ゼロ? フォークの場合は戻りのvfork()システムコール

()アドレス空間にもコピーされますと、PID変数の2つのコピーがそれぞれの子と親であるので、私はこの場合、2つの異なるコピーを理解することができます異なる値がフォークで戻ってきたことができます()の場合、vfork()の2つの値が返される方法を理解できませんvfork()

+2

これは致命的です - あなたは['vfork()'](http://pubs.opengroup.org/onlinepubs/009695399/toc.htm)の子で 'exec()'または '_exitしかし、それはちょうどそれです。他のほとんどは、未定義の動作につながります。推奨:['vfork()'](http://pubs.opengroup.org/onlinepubs/007908799/xsh/vfork.html)は使わないでください。確かに、私はそれを安全に使う方法を学ぶことさえ気にしませんでした。それは 'gets()'のようなもので、ふりをするのが最善である関数は存在しません。 –

+1

@JonathanLeffler: 'vfork()'はMMUレスシステムでは非常に便利です。 – ninjalj

+0

はい、私はそれを使用すべきではないと私は同意しますが、vforkを使ってプロセスツリーを作成し、ツリーの異なるレベルのプロセス間の通信の問題を解決していました。私は、urのアドバイスをしておきます。 –

答えて

6

2部ありません。 vforkの場合は、子供がそのことをしている間に親がフリーズします(_exit(2)またはexecve(2)を呼び出すまで)。だから、一瞬でも、ただ一つのpid変数があります。

あなたがしていることは、安全でないことです。 The standard明確にそれを綴る:

のvfork()関数は 動作が未定義であることを除いて、フォーク()と同等でなければならないのvforkによって作成されたプロセスは、()のいずれか が変数以外のデータを変更する場合vfork()からの戻り値を格納するために使用されたpid_t型の戻り値。 vfork()が呼び出された関数から返されるか、またはは他の関数を呼び出す前に成功しました_exit()機能。

vforkSUSv4から削除されました。実際に使用する意味はありません。

+0

これは、作成したプロセスを使用している間に、** pid_t **変数タイプの値を変更することができることを意味します。** pid_t **変数の以前の値が復元される方法? –

+2

@ L.ppt親が 'pid_t'を続けると、子のPIDが保存されます。 – cnicutar

+2

@ L.ppt:コンパイラは 'vfork()'から返された 'pid_t'変数を特別に扱います。それは常にレジスタ上にあり、メモリに流出しません。 – ninjalj