[解決済み】forkとexecの違いについて
質問
とはどのような違いがあるのでしょうか?
fork
と
exec
?
解決方法は?
を使用します。
fork
と
exec
は、新しいプロセスを開始するための非常にシンプルな方法を提供するという点で、UNIXの精神を体現しています。
その
fork
の呼び出しは基本的に現在のプロセスの複製を作成します。
ほとんど
を使用します。すべてがコピーされるわけではありませんが(たとえば、実装によってはリソースの制限があります)、できるだけ近いコピーを作成することを目的としています。
新しいプロセス(子)は異なるプロセスID(PID)を取得し、古いプロセス(親)のPIDをその親PID(PPID)として持ちます。2 つのプロセスは全く同じコードを実行するようになったので、 どちらがそうであるかは
fork
- 子は0を、親は子のPIDを取得します。もちろん、これはすべて
fork
の呼び出しがうまくいかなかった場合、子は作成されず、親はエラーコードを受け取ります。
この
exec
の呼び出しは、基本的に現在のプロセス全体を新しいプログラムに置き換えるための方法です。これは、現在のプロセス空間にプログラムをロードし、エントリポイントから実行します。
だから
fork
と
exec
は、現在のプロセスの子プロセスとして新しいプログラムを実行させるために、しばしば順番に使用されます。シェルは通常、次のようなプログラムを実行しようとすると、このような動作をします。
find
- シェルがフォークし、その子シェルが
find
プログラムをメモリに書き込み、すべてのコマンドライン引数、標準I/Oなどを設定します。
しかし、これらは一緒に使う必要はありません。あるプログラムが
fork
を使用せずに
exec
例えば、プログラムが親と子の両方のコードを含んでいる場合(実装ごとに制約があるかもしれないので注意が必要です)。これは、単にTCPポートをリッスンするデーモンによく使われました(現在も使われています)。
fork
を作成し、親がリスニングに戻っている間に特定のリクエストを処理するようにしました。
同様に、自分が終了し、別のプログラムを実行したいだけのプログラムは、そのために
fork
,
exec
で、次に
wait
を使用します。子プロセスを直接プロセススペースにロードすることができます。
UNIX の実装の中には、最適化された
fork
これは、コピーオンライトと呼ばれるものを使用します。のプロセス空間のコピーを遅らせるためのトリックです。
fork
が、その空間内の何かを変更しようとするときまで。この機能は
fork
であり
exec
プロセス空間全体をコピーする必要がないという点です。
もし
exec
は
以下のように呼び出されます。
fork
(そして、これはほとんど起こることです)、それはプロセス空間への書き込みを引き起こし、そして、それは子プロセスのためにコピーされます。
の全ファミリーが存在することに注意してください。
exec
の呼び出しがあります (
execl
,
execle
,
execve
など)が
exec
のいずれかを意味します。
次の図は、典型的な
fork/exec
の操作で
bash
シェルは、ディレクトリをリストアップするために
ls
コマンドを使用します。
+--------+
| pid=7 |
| ppid=4 |
| bash |
+--------+
|
| calls fork
V
+--------+ +--------+
| pid=7 | forks | pid=22 |
| ppid=4 | ----------> | ppid=7 |
| bash | | bash |
+--------+ +--------+
| |
| waits for pid 22 | calls exec to run ls
| V
| +--------+
| | pid=22 |
| | ppid=7 |
| | ls |
V +--------+
+--------+ |
| pid=7 | | exits
| ppid=4 | <---------------+
| bash |
+--------+
|
| continues
V
関連
-
[解決済み】エラー:cの入力の最後に期待される宣言またはステートメント
-
[解決済み】スタックスマッシュを検出しました
-
[解決済み】C言語でpow( )への未定義参照、math.hを含むにもかかわらず【重複】。
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] シェルで、「2>&1」はどういう意味ですか?
-
[解決済み] time(1) の出力における 'real', 'user' および 'sys' はどのような意味ですか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] ++iとi++の違いは何ですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み】fork()、vfork()、exec()、clone()の違いについて)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】valgrind - サイズ8のブロックが割り当てられた後、アドレス ---- が0バイトになる。
-
[解決済み】strcmpが機能しない
-
[解決済み] (.text+0x20): `main'への未定義の参照と関数への未定義の参照
-
[解決済み】 strcpyとstrdupの比較
-
[解決済み] clang: error: linker command failed with exit code 1が表示されるのはなぜですか?
-
[解決済み】C 未知の型名「my_structure」。
-
[解決済み] テスト
-
[解決済み】execvp: バッドアドレスエラー
-
[解決済み】fork()、vfork()、exec()、clone()の違いについて)
-
[解決済み] Windowsでfork()に最も近いものは何ですか?