すべてのアプリケーション (プログラム) は、実行中のプログラム インスタンスであるプロセスを通じて実行されます。プロセスはさまざまなシステム コールを通じて作成されます。最も一般的なものは fork() と exec() ですが、それらの違いは何でしょうか?次の記事では fork() と exec() の違いを紹介しますので、お役に立てれば幸いです。 C 言語の
#fork()
pid_t pid = fork();fork() は、呼び出しプロセスをコピーして作成されます。新しいプロセスは新しい PID で生成され、その新しいプロセス (子プロセスと呼ばれます) は呼び出し側プロセス (親プロセスと呼ばれます) の正確なコピーです。 2 つのプロセスは、次の点を除いてほぼ同一です。 1. 子プロセスには独自の一意のプロセス ID があり、この PID は既存のプロセス グループの ID と一致しません。 2. 子プロセスの親プロセス ID は、呼び出し元プロセスの ID と同じです。 3. 子は、親のメモリ ロックとセマフォ調整を継承しません。 4. 子は、親から未完了の非同期 I/O 操作を継承せず、親から非同期 I/O コンテキストも継承しません。
fork()の戻り値
fork()はパラメータを受け入れず、整数値を返します。以下は、fork() によって返されるさまざまな値です。
# 負の値: 子プロセスの作成に失敗しました。 # ゼロ: 新しく作成された子プロセスに戻ります。#●正の値: 親または呼び出し元を返します。この値には、新しく作成された子プロセスのプロセス ID が含まれます。
注: 成功すると、子プロセスの PID が親プロセスに返され、子プロセスには 0 が返されます。失敗すると、親プロセスに -1 が返され、子プロセスは作成されず、errno が適切に設定されます。
C 言語の Exec()
exec() 関数シリーズは、現在のプロセス イメージを新しいプロセス イメージに置き換えます。プログラムを現在のプロセス空間にロードし、エントリ ポイントから実行します。 例: 次の C プログラムに execv() を実装しました。exec() シリーズは、
int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execle(const char *path, const char *arg, ...,char * const envp[]); int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); int execvpe(const char *file, char *const argv[],char *const envp[]);
fork() と exec( )
#1. fork() は、それを呼び出したプロセスのコピーである新しいプロセスを作成して開始します。2 つのプロセスはまったく同じです。一方、exec() は、現在のプロセス イメージは別の (別の) プロセス イメージに置き換えられ、現在のプロセスの「データ セグメント」、「スタック セグメント」、および「コード セグメント」が新しいプログラムによって上書きされます。 2. Fork() は新しいプロセスを作成し、新しい PID を生成するため、子プロセスは独自のプロセス ID を持ちます。 exec は新しいプログラムを開始し、元のプロセスを置き換えます。そのため、新しいプログラムは exec() を呼び出すプロセスの ID を変更しないままにします。つまり、exec によって実行される新しいプロセスの PID は変更されず、プロセスと同じになります。 exec関数を呼び出します。
3. fork() の前に親プロセスによって開かれたファイル記述子は、子プロセスでも開かれ、同じファイル テーブル エントリを指します。ただし、exec() を呼び出す前にオープンされた記述子は引き続きオープンされます。
おすすめの関連ビデオチュートリアル: 「
C 言語チュートリアル」
以上がこの記事の全内容です。皆様の学習にお役に立てれば幸いです。さらにエキサイティングなコンテンツについては、PHP 中国語 Web サイトの関連チュートリアルのコラムに注目してください。 ! !
以上がC の fork() と exec() の違いは何ですか? fork() と exec() の簡単な比較の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。