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

C++のfork()で親プロセスと子プロセスを作成して計算を行う方法

この記事では、C++でfork()システムコールを使って子プロセスを生成する方法を解説します。さらに、親プロセスと子プロセスそれぞれで異なる計算を実行してみます。具体的には、親プロセスでは配列内の偶数の合計値を求め、子プロセスでは奇数の合計値を求めます。

fork()の仕組み

fork()が呼び出されると、戻り値として整数が返されます。この戻り値が0より大きい場合、現在実行中のコードは親プロセス側にあります。一方、戻り値が0の場合は子プロセス側です。また、プロセスの生成に失敗した場合は-1が返されます。この戻り値を判定に使うことで、親プロセスと子プロセスの処理を簡単に切り分けることができます。

なお、fork()はPOSIX準拠の関数であるため、LinuxやmacOSなどのUnix系OSで利用可能です。Windows環境ではそのまま使用できない点に注意してください。使用する際は<unistd.h>ヘッダーのインクルードが必要です。

サンプルコード

#include <iostream>
#include <unistd.h>
using namespace std;

int main() {
    int a[15] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
    int odd_sum = 0, even_sum = 0, n, i;
    n = fork(); // プロセスを分割する
    if (n > 0) { // n が 0 以外の場合は親プロセス
        for (int i : a) {
            if (i % 2 == 0)
                even_sum = even_sum + i;
        }
        cout << "Parent process" << endl;
        cout << "Sum of even numbers: " << even_sum << endl;
    } else { // n が 0 の場合は子プロセス
        for (int i : a) {
            if (i % 2 != 0)
                odd_sum = odd_sum + i;
        }
        cout << "Child process" << endl;
        cout << "Sum of odd numbers: " << odd_sum << endl;
    }
    return 0;
}

実行結果

Parent process
Sum of even numbers: 56
Child process
Sum of odd numbers: 64

このプログラムでは、配列 {1, 2, 3, ... , 15} の要素を対象に計算を行っています。親プロセスは偶数(2+4+6+8+10+12+14)の合計である56を出力し、子プロセスは奇数(1+3+5+7+9+11+13+15)の合計である64を出力します。

なお、親プロセスと子プロセスは並行して動作するため、実行環境やタイミングによっては出力される順序が入れ替わる場合があります。これは正常な動作であり、マルチプロセスプログラミング特有の挙動です。

  1. C++とオイラー特性でサッカーボールの五角形・六角形の数を求める方法

    サッカーボールをよく見ると、黒い五角形と白い六角形がパズルのように組み合わさり、完璧な球体を形作っていることがわかります。本記事では、オイラー特性(Euler characteristic)という数学的手法を用いて、サッカーボール上に存在する五角形と六角形の数を求める方法を解説し、最後にC++での実装例も紹介します。 オイラー特性とは オイラー特性とは、位相空間における図形や構造の特徴を表す数値です。球面の場合、オイラー特性は常に2になることが知られており、この性質を利用することで、サッカーボール上の五角形と六角形の数を計算できます。 オイラー特性では、以下の要素を使用します。 χ(S) —

  2. C++とOpenCVで画像を読み込んで表示する方法を徹底解説

    この記事では、C++でOpenCVを使用して画像を読み込み、表示する方法について詳しく解説します。OpenCVで画像の読み込みや表示を行うには、以下のような関数やデータ構造が必要になります。 画像処理に必要な基本要素 Mat(マトリクス) Matは関数ではなく、データ構造の一種である変数型です。C++におけるint型やchar型、string型のように、MatはOpenCV独自の変数型であり、画像を格納するための行列(マトリクス)データ構造を作成します。プログラム内で「Mat myImage;」と記述した場合、「myImage」という名前の行列変数を宣言していることになります。 name