1. ホーム
  2. c

[解決済み】forkとexecの違いについて

2022-04-06 16:23:05

質問

とはどのような違いがあるのでしょうか? forkexec ?

解決方法は?

を使用します。 forkexec は、新しいプロセスを開始するための非常にシンプルな方法を提供するという点で、UNIXの精神を体現しています。

その fork の呼び出しは基本的に現在のプロセスの複製を作成します。 ほとんど を使用します。すべてがコピーされるわけではありませんが(たとえば、実装によってはリソースの制限があります)、できるだけ近いコピーを作成することを目的としています。

新しいプロセス(子)は異なるプロセスID(PID)を取得し、古いプロセス(親)のPIDをその親PID(PPID)として持ちます。2 つのプロセスは全く同じコードを実行するようになったので、 どちらがそうであるかは fork - 子は0を、親は子のPIDを取得します。もちろん、これはすべて fork の呼び出しがうまくいかなかった場合、子は作成されず、親はエラーコードを受け取ります。

この exec の呼び出しは、基本的に現在のプロセス全体を新しいプログラムに置き換えるための方法です。これは、現在のプロセス空間にプログラムをロードし、エントリポイントから実行します。

だから forkexec は、現在のプロセスの子プロセスとして新しいプログラムを実行させるために、しばしば順番に使用されます。シェルは通常、次のようなプログラムを実行しようとすると、このような動作をします。 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