- fork(): fork()関数は、現在のプロセスのコピーを作成します。新しいプロセス(子プロセス)は、元のプロセス(親プロセス)と同じプログラムコードから開始されます。fork()関数の戻り値は、子プロセスのプロセスID(PID)です。親プロセスと子プロセスは、異なるメモリ空間を持ちますが、親プロセスのすべてのリソース(変数、ハンドル、ファイルディスクリプタなど)が子プロセスにコピーされます。
fork()の一般的な使用法は、親プロセスと子プロセスの並行処理(プロセスの同時実行)です。親プロセスはfork()を呼び出し、子プロセスを生成します。子プロセスは異なるタスクや処理を実行することができます。例えば、Webサーバーはfork()を使用して、複数のクライアント要求を同時に処理することができます。
以下は、fork()のシンプルなコード例です。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
pid_t pid;
pid = fork();
if (pid == 0) {
// 子プロセスの処理
printf("子プロセスです。\n");
} else if (pid > 0) {
// 親プロセスの処理
printf("親プロセスです。\n");
} else {
// fork()が失敗した場合の処理
fprintf(stderr, "fork()エラー\n");
return 1;
}
return 0;
}
- exec(): exec()関数は、新しいプロセスを実行するために使用されます。exec()関数は、新しいプログラムをメモリにロードし、現在のプロセスのメモリ内容を置き換えます。つまり、exec()関数を呼び出すと、現在のプロセスが新しいプログラムになります。exec()関数は新しいプロセスIDを返さないため、成功した場合は実行されず、エラーが発生した場合のみ戻ります。
exec()関数は、新しいプロセスを起動するために使用される典型的な関数であり、一般的な使用法は以下の通りです。
#include <stdio.h>
#include <unistd.h>
int main() {
char *args[] = {"ls", "-l", NULL};
execvp("ls", args);
// exec()が成功した場合、この行は実行されません。
fprintf(stderr, "exec()エラー\n");
return 1;
}
上記の例では、execvp()関数を使用して新しいプロセスを起動しています。引数として、"ls"コマンドとそのオプションを指定しています。execvp()関数は、指定したプログラムをパスから探し、実行します。もしexecvp()が成功すると、現在のプロセスは新しいプログラム(この場合はlsコマンド)に置き換わります。
以上がfork()とexec()の違いと使い方の概要です。fork()は新しいプロセスを生成するために使用され、子プロセスは親プロセスのコピーとして作成されます。exec()は新しいプロセスを実行するために使用され、現在のプロセスのメモリ内容を置き換えます。
fork()とexec()は、C言語の関数であり、新しいプロセスを生成するために使用されます。それぞれの目的と使い方について説明します。
- fork(): fork()関数は、現在のプロセスのコピーを作成します。新しいプロセス(子プロセス)は、元のプロセス(親プロセス)と同じプログラムコードから開始されます。fork()関数の戻り値は、子プロセスのプロセスID(PID)です。親プロセスと子プロセスは、異なるメモリ空間を持ちますが、親プロセスのリソースが子プロセスにコピーされます。
fork()の一般的な使用法は、並行処理です。親プロセスはfork()を呼び出し、子プロセスを生成します。子プロセスは異なるタスクや処理を実行することができます。
以下は、fork()の簡単なコード例です。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
pid_t pid;
pid = fork();
if (pid == 0) {
// 子プロセスの処理
printf("子プロセスです。\n");
} else if (pid > 0) {
// 親プロセスの処理
printf("親プロセスです。\n");
} else {
// fork()が失敗した場合の処理
fprintf(stderr, "fork()エラー\n");
return 1;
}
return 0;
}
- exec(): exec()関数は、新しいプロセスを実行するために使用されます。exec()関数は、新しいプログラムをメモリにロードし、現在のプロセスのメモリ内容を置き換えます。つまり、exec()関数を呼び出すと、現在のプロセスが新しいプログラムになります。exec()関数は新しいプロセスIDを返さないため、成功した場合は実行されず、エラーが発生した場合のみ戻ります。
以下は、exec()の簡単なコード例です。
#include <stdio.h>
#include <unistd.h>
int main() {
char *args[] = {"ls", "-l", NULL};
execvp("ls", args);
// exec()が成功した場合、この行は実行されません。
fprintf(stderr, "exec()エラー\n");
return 1;
}
上記の例では、execvp()関数を使用して新しいプロセスを起動しています。引数として、"ls"コマンドとそのオプションを指定しています。execvp()関数は、指定したプログラムをパスから探し、実行します。もしexecvp()が成功すると、現在のプロセスは新しいプログラム(この場合はlsコマンド)に置き換わります。
fork()とexec()は、プロセスの生成と実行に関連する重要な関数です。それぞれの目的と使い方を理解することで、効果的なプロセス