問題タブ [vfork]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - vforkは終わらない
次のコードは決して終了しません。何故ですか?
アップデート:
このコードは、 に関するいくつかの混乱を説明するためのものvfork()です。を使用するvfork()と、子プロセスが親のアドレス空間をコピーしないようです。代わりに、アドレス空間を共有します。その場合、両方のプロセスによって nums 配列が更新されると予想されますが、私の質問はどのような順序ですか? OS は 2 つの間でどのように同期しますか?
コードが終了しない理由については、おそらく終了用に明示的に_exit()orexec()ステートメントを持っていないためです。私は正しいですか?
UPDATE2:
読んだところ: 56. fork() と vfork() システム コールの違いは?
この記事は、私の最初の混乱を解決するのに役立つと思います。
vfork() システム コールからの子プロセスは、親のアドレス空間で実行され (これにより、親のデータと stack が上書きされる可能性があります)、子プロセスが終了するまで親プロセスが中断されます。
c - vfork() が親プロセスのクラッシュ (セグメント障害) を引き起こすのはなぜですか?
vfork は親プロセスの変数を変更できますが、スタックを増やすことができないのはなぜですか?
f2() はクラッシュにつながります。
vfork() を fork() に変更すると、クラッシュは発生しません。
c - gcc -O2 を指定した vfork() の結果が間違っているようです。
コードは APUE から取得しました。Ubuntu 12.04 で gcc を最適化せずに使用すると、本と同じ結果が得られます。
gcc -O2 を使用すると、var は 88 になります。これは、gcc の最適化が vfork() で何かを行うためですか?
linux - vfork を使用して複数のプロセスを作成するには?
これは vfork() のプログラムです。このプログラムは、複数の親プロセスと子プロセスを作成し、最後に -1 を返します (OS が別のプロセスを作成できないことを意味します)。なぜそのような行動が起こるのですか?
c - vfork が呼び出された後の奇妙な出力
プログラムの出力は以下のとおりです。
子プロセス:0
0
親プロセス:6958
子プロセス:0
セグメンテーション違反
私が知っているように、vfork は、exec または exit 関数が呼び出され、スタック セグメントが共有されていない限り、親プロセスを中断します。だからここに私は2つの質問があります:
それらは共通のアドレス空間を共有しているため、exit(0) は両方のプロセスに影響しますか? もしそうなら、どのように?そうでない場合、なぜですか?
「parent proc:6958」の後に「child proc:0」の行があるのはなぜですか? 予期しない動作のような答えは期待していません。
また、逆アセンブルしてみると、vfork の呼び出しが正常に機能していないことに気付きました。スタック バランスはありません: 関数 vfork のアセンブラー コードのダンプ:
実際にはリターン アドレスを ecx にポップし、システム コール (0xb7ed206e <+30>: int 0x80 0xb7ed2070 <+32>: push ecx) の後にプッシュ バックします。一番珍しいのは ret 命令があること: 0xb7ed2083 <+51>: ret
アセンブル言語に詳しくないのですが、どなたか教えていただけないでしょうか?
c - vfork() を呼び出す場合、任意の exec*() 関数を呼び出すことができますか、それとも execve() を呼び出す必要がありますか?
この
vfork()関数は と同じ効果がありますが、プロセスが [...]ファミリの関数fork(2)の 1 つを正常に呼び出す前に [...] 他の関数を呼び出した場合の動作は未定義です。exec(3)
exec*()これは、後で任意の関数を呼び出すことvfork()が許容されることを示唆しています。ただし、マニュアルページの後半では、具体的に次のように述べています。
特に、プログラマーは、子 [...] が [...] を呼び出すまで、親がブロックされたままになることに依存できません
execve(2)。
execve(2)は man ページで繰り返し使用されており、その使用法は、 のexec後に受け入れられる唯一のタイプの関数であることを示唆していvfork()ます。
では、なぜ がここで選ばれているのでしょうか。他のタイプの関数 ( など)execveを呼び出しても安全でしょうか?execexeclp
c - vfork() 暗黙の宣言
私は vfork() を使用して C で作業しています。私のプログラムは正常に動作していますが、暗黙の宣言に関する警告があります。
私のコード:
私の警告は次のとおりです。
関数 'vfork' の暗黙の宣言 [-Wimplicit-function-declaration] if(vfork()==0){^
私はそれらを含めます:
vfork() ではなく fork() を使用すると、警告がなくなります。スーの問題は、私のプログラムでは vfork() だけです。これが何を意味するのか、どのように修正するのかわかりません。