問題タブ [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.

0 投票する
6 に答える
37266 参照

c - fork()とvfork()の違いは何ですか?

fork()との違いは何vfork()ですか?vfork()のように戻りますかfork()

0 投票する
5 に答える
3602 参照

c - vforkは終わらない

次のコードは決して終了しません。何故ですか?

アップデート:

このコードは、 に関するいくつかの混乱を説明するためのものvfork()です。を使用するvfork()と、子プロセスが親のアドレス空間をコピーしないようです。代わりに、アドレス空間を共有します。その場合、両方のプロセスによって nums 配列が更新されると予想されますが、私の質問はどのような順序ですか? OS は 2 つの間でどのように同期しますか?

コードが終了しない理由については、おそらく終了用に明示的に_exit()orexec()ステートメントを持っていないためです。私は正しいですか?

UPDATE2:
読んだところ: 56. fork() と vfork() システム コールの違いは? この記事は、私の最初の混乱を解決するのに役立つと思います。

vfork() システム コールからの子プロセスは、親のアドレス空間で実行され (これにより、親のデータと stack が上書きされる可能性があります)、子プロセスが終了するまで親プロセスが中断されます。

0 投票する
1 に答える
551 参照

c - vfork() が親プロセスのクラッシュ (セグメント障害) を引き起こすのはなぜですか?

vfork は親プロセスの変数を変更できますが、スタックを増やすことができないのはなぜですか?

f2() はクラッシュにつながります。

vfork() を fork() に変更すると、クラッシュは発生しません。

0 投票する
1 に答える
197 参照

c - gcc -O2 を指定した vfork() の結果が間違っているようです。

コードは APUE から取得しました。Ubuntu 12.04 で gcc を最適化せずに使用すると、本と同じ結果が得られます。

gcc -O2 を使用すると、var は 88 になります。これは、gcc の最適化が vfork() で何かを行うためですか?

0 投票する
1 に答える
357 参照

linux - vfork を使用して複数のプロセスを作成するには?

これは vfork() のプログラムです。このプログラムは、複数の親プロセスと子プロセスを作成し、最後に -1 を返します (OS が別のプロセスを作成できないことを意味します)。なぜそのような行動が起こるのですか?

0 投票する
2 に答える
254 参照

c - vfork が呼び出された後の奇妙な出力

プログラムの出力は以下のとおりです。

子プロセス:0

0

親プロセス:6958

子プロセス:0

セグメンテーション違反

私が知っているように、vfork は、exec または exit 関数が呼び出され、スタック セグメントが共有されていない限り、親プロセスを中断します。だからここに私は2つの質問があります:

  1. それらは共通のアドレス空間を共有しているため、exit(0) は両方のプロセスに影響しますか? もしそうなら、どのように?そうでない場合、なぜですか?

  2. 「parent proc:6958」の後に「child proc:0」の行があるのはなぜですか? 予期しない動作のような答えは期待していません。

また、逆アセンブルしてみると、vfork の呼び出しが正常に機能していないことに気付きました。スタック バランスはありません: 関数 vfork のアセンブラー コードのダンプ:

実際にはリターン アドレスを ecx にポップし、システム コール (0xb7ed206e <+30>: int 0x80 0xb7ed2070 <+32>: push ecx) の後にプッシュ バックします。一番珍しいのは ret 命令があること: 0xb7ed2083 <+51>: ret

アセンブル言語に詳しくないのですが、どなたか教えていただけないでしょうか?

0 投票する
3 に答える
1006 参照

c - vfork() を呼び出す場合、任意の exec*() 関数を呼び出すことができますか、それとも execve() を呼び出す必要がありますか?

Linux のマニュアル ページから:

このvfork()関数は と同じ効果がありますが、プロセスが [...]ファミリの関数fork(2)の 1 つを正常に呼び出す前に [...] 他の関数を呼び出した場合の動作は未定義です。exec(3)

exec*()これは、後で任意の関数を呼び出すことvfork()が許容されることを示唆しています。ただし、マニュアルページの後半では、具体的に次のように述べています。

特に、プログラマーは、子 [...] が [...] を呼び出すまで、親がブロックされたままになることに依存できませんexecve(2)

execve(2)は man ページで繰り返し使用されており、その使用法は、 のexec後に受け入れられる唯一のタイプの関数であることを示唆していvfork()ます。

では、なぜ がここで選ばれているのでしょうか。他のタイプの関数 ( など)execveを呼び出しても安全でしょうか?execexeclp

0 投票する
3 に答える
978 参照

c - vfork() 暗黙の宣言

私は vfork() を使用して C で作業しています。私のプログラムは正常に動作していますが、暗黙の宣言に関する警告があります。

私のコード:

私の警告は次のとおりです。

関数 'vfork' の暗黙の宣言 [-Wimplicit-function-declaration] if(vfork()==0){^

私はそれらを含めます:

vfork() ではなく fork() を使用すると、警告がなくなります。スーの問題は、私のプログラムでは vfork() だけです。これが何を意味するのか、どのように修正するのかわかりません。