fork()とexec()の違いと使い方


  1. 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;
}
  1. 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言語の関数であり、新しいプロセスを生成するために使用されます。それぞれの目的と使い方について説明します。

  1. 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;
}
  1. 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()は、プロセスの生成と実行に関連する重要な関数です。それぞれの目的と使い方を理解することで、効果的なプロセス