Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語のfork()システムコールとは?子プロセスの作成方法と戻り値を解説

fork()システムコールの概要

この記事では、C言語におけるfork()システムコールについて解説します。fork()は、新しいプロセスを作成するためのシステムコールです。新しく作成されたプロセスは子プロセスと呼ばれ、子プロセスを生成する元となる現在のプロセスは親プロセスと呼ばれます。

子プロセスは、親プロセスが使用していたプログラムカウンタ、CPUレジスタ、開いているファイルなどをそのまま引き継いで動作します。つまり、fork()が呼び出された時点から、親プロセスと子プロセスの2つのプロセスが同じプログラムのコードを並行して実行していくことになります。

fork()の戻り値

fork()は引数を一切取らず、戻り値として整数値を返します。この戻り値には、次の3種類があります。

  • 負の値(マイナスの数値):子プロセスの作成に失敗した場合に返されます。プロセス数の上限に達している場合などが該当します。

  • 0(ゼロ):新しく作成された子プロセス側に返されます。つまり、戻り値が0の場合、そのコードは子プロセスで実行されています。

  • 正の値(プラスの数値):親プロセス側に返されます。この正の値は、生成された子プロセスのプロセスID(PID)となっています。

この戻り値の性質を利用することで、if文による分岐処理によって「親プロセスだけが実行する処理」と「子プロセスだけが実行する処理」を分けることができます。

サンプルコード

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
    fork(); // 同じ内容の子プロセスを生成する
    printf("Fork testing code\n");
    return 0;
}

実行結果

soumyadeep@soumyadeep-VirtualBox:~$ ./a.out
Fork testing code
soumyadeep@soumyadeep-VirtualBox:~$ Fork testing code
soumyadeep@soumyadeep-VirtualBox:~$

実行結果の解説

出力を見ると、「Fork testing code」が2回表示されていることが分かります。これは、fork()の呼び出しによって親プロセスと子プロセスの2つのプロセスが存在することになり、fork()以降のコード(printf文)が両方のプロセスでそれぞれ1回ずつ実行されたためです。

なお、どちらの出力が先に表示されるかはOSのスケジューリングに依存するため、実行のたびに順序が変わる可能性がある点にも注意してください。

  1. igfxEM.exeとは?プロセスの正体・安全性の見分け方と無効化の手順を解説

    一部のユーザーから、igfxEM.exeというプロセスが本物なのかどうかという疑問が寄せられています。この疑念は、igfxEM.exeがCドライブ上の特定ファイルへのアクセスや、サードパーティ製アプリケーションのアップデートを妨げていることに気づいたときに生じることが多いようです。 igfxem.exeとは何か? 正規のigfxem.exeプロセスは、インテル(Intel)のグラフィックススイートに属しており、Intel(R) Common User Interfaceの一部として「Graphics Executable Main Module(グラフィックス実行メインモジュール)」とも呼ばれ

  2. au_.exeとは何か?正規プロセスの見分け方と安全性の確認・削除方法

    タスクマネージャーでシステムリソースを大量に消費しているau_.exeプロセスを目にし、「ウイルスではないか」と疑うユーザーは少なくありません。特に、ソフトウェアのインストールやアンインストール中など、システムが高負荷状態のときに、このプロセスによるリソース使用率の上昇が報告されるケースが目立ちます。 また、au_.exeはAvast、McAfee、Aviraなどのセキュリティソフトに検出されることもあります。ただし、これらの検出の大部分は誤検知(偽陽性)であることが確認されています。 実行ファイルそのものが悪意のあるものである可能性は低いものの、ソフトウェアのインストール/アンインストールを