2011-11-20 20 views
0

私の質問は実行中親スタックにはどうなりますか?Vfork()以上の破損

main() 
{ 
    f(); 
    g(); 
} 
f() 
{ 
    vfork(); 
} 
g() 
{ 
    int blast[100],i; 
    for(i=0;i<100;i++) 
     blast[i]=i; 
} 

答えて

3

動作はのvforkによって作成されたプロセスは、()[...]のvfork()が[呼び出された関数から返された場合の動作は未定義であるhttp://pubs.opengroup.org/onlinepubs/009695399/functions/vfork.html

に従って定義されていません。 ..]

+0

しかし、可能な出力は何ですか? – Aragorn

+1

*何かが起こる可能性があります。一般的な実装では、子は親のスタック空間にゼロを書き込み、後で親は完全に閉じ込められたスタックフレームを持つ関数から戻ろうとします。 – chill

-1

実際にはvforkはもはやあまり役に立たない。 Linuxのvfork manページを読んでください。POSIX.1-2008は、vfork()の仕様を削除しています。の動作は、実際にはfork(親が中断されていることを除いて)とほぼ同じです。だから、実際には、vforkは今日はforkとほとんど似ています。しかし、私が過去10年間に読んだプログラムでは、forkではなくvforkとなっています(なぜなら、書込みページング動作の遅延コピーは今日では十分に効率的だからです)。

+0

実際には、 'vfork()'の現代的な使用法は 'posix_spawn'に似ています。つまり、MMUなしでは' fork() '(効率的にとにかく)できません。 – ninjalj

+0

最近、vforkを使用する理由はほとんど同じです。ページテーブルのコピーはメモリをコピーするよりも高速ですが、特に大規模なプロセスでは、かなりの時間がかかります。 –