問題タブ [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 はメモリの "free()" クラッシュを引き起こしますが、fork はクラッシュしません。
以下のように、vfork が親プロセスとメモリを共有する子プロセスを作成するかどうかを確認しようとしていました。
i と *pi が父子プロセス間で共有されている場合の値を期待していましたが、実行すると $ g++ myvshare.cpp && ./a.out
私が混乱したこと:
i と *pi が共有されているという点で、vfork は fork とは異なるはずです。しかし、まだ vfork は i と *pi に COW を持っているようです。父が値を設定すると、子はまだ古い値を取得し、その逆も同様です。
「free()」が失敗したことを示すコア ダンプがあるのはなぜですか? vfork を fork に変更しようとしましたが、そのような問題はありません。これは libc や glibc の内部でどのように起こったのでしょうか?
ありがとう!
c - vfork の後で dup2 を呼び出すことはできますか?
vfork()子プロセスが必要ですstdoutが、親プロセスとは異なりstdoutます。
でこれを達成する明白な方法は、フォーク後に子fork()にdup2()(およびclose()元のファイル記述子を) することです。
呼び出す前にファイル記述子の準備ができておりvfork()、関数を呼び出す前にこれら 2 つのシステム コールを呼び出す必要があるとしexec*()ます。私はそれをしてもいいですか?
exec - 親のメモリに対する vfork() 後の exec() の影響
現在、仮想メモリに関する Silberschatz のオペレーティング システムの章を読んでいます。
ここでは、次のように述べられています。
" vfork() を使用すると、親プロセスは中断され、子プロセスは親のアドレス空間を使用します。vfork() はコピー オン ライトを使用しないため、子プロセスが親のアドレス空間のページを変更すると、変更されたページは、再開後に親に表示されます。
[...] Vfork() は、子プロセスが作成直後に exec() を呼び出すときに使用することを目的としています。"
私の記憶が正しければ、exec( ) は現在のプロセス イメージを置き換えます。
アドレス空間が共有されているため、vfork() を後続の exec() 呼び出しで呼び出すと、親のプロセス イメージも置き換えられますか?
c - SIGALRM を使用してプログラムを終了する方法
基本的に、私のプログラムには 4 ~ 5 個の関数があります。多くのコード行とファイルからの読み取りと書き込みであり、無限ループ (最悪の場合) で終了する可能性があり、たとえば 20 秒を超えた場合はプログラムを終了したいと考えています。以下のコードが機能せず、プログラムがハングし、プログラム自体が終了するのではなく、OS が終了します。私が抱えている主な問題は、メインでアラームが設定されており、アラームの制限時間に達すると、プロセスが別の関数で実行されているため、ファイルを閉じたり子プロセスを強制終了したりせずにプログラムがシャットダウンすることです。これは私が今持っているものです: