C++でfork()とwait()を使ってプロセスを下から上へ順番に実行する方法
fork()システムコールは、1つのプロセスを2つのプロセスに分割するために使用されます。fork()関数が0を返した場合はそのプロセスが子プロセスであり、0以外を返した場合は親プロセスであると判断できます。
この記事では、プロセスを4つに分割し、それらをボトムアップ(下から上)の順序で実行する方法を解説します。まず、fork()関数を2回連続で呼び出します。最初のfork()で子プロセスが生成され、次のfork()でもう1つの子プロセスが生成され、さらに内側のfork()からは自動的に孫プロセスが作られます。結果として、親プロセス1つ、子プロセス2つ、孫プロセス1つの計4つのプロセスが存在することになります。
各プロセスの判定条件は以下の通りです。
- id1 > 0 かつ id2 > 0 → 親プロセス
- id1 == 0 かつ id2 > 0 → 第1子プロセス
- id1 > 0 かつ id2 == 0 → 第2子プロセス
- id1 == 0 かつ id2 == 0 → 孫プロセス
ここではwait()関数を使って終了待ちを行い、sleep()関数で遅延を発生させることで、プロセスを意図的に下から上の順序で実行させています。
サンプルコード
#include <iostream>
#include <sys/wait.h>
#include <unistd.h>
using namespace std;
int main() {
pid_t id1 = fork(); // 2回の連続したfork()で4つのプロセスを生成(親・子2つ・孫1つ)
pid_t id2 = fork();
if (id1 > 0 && id2 > 0) { // 両方のIDが0以外なら親プロセス
wait(NULL);
wait(NULL);
cout << "Ending of parent process" << endl;
}else if (id1 == 0 && id2 > 0) { // 第1のIDが0なら第1子プロセス
sleep(2); // 第2子を先に実行させるため2秒待機
wait(NULL);
cout << "Ending of First Child" << endl;
}else if (id1 > 0 && id2 == 0) { // 第2のIDが0なら第2子プロセス
sleep(1); // 1秒待機
cout << "Ending of Second child process" << endl;
}else {
cout << "Ending of grand child" << endl;
}
return 0;
}実行結果
soumyadeep@soumyadeep-VirtualBox:~$ ./a.out Ending of grand child Ending of Second child process Ending of First Child Ending of parent process soumyadeep@soumyadeep-VirtualBox:~$
実行順序の解説
出力結果を見ると、メッセージが「孫 → 第2子 → 第1子 → 親」の順に表示されていることが分かります。これは以下の仕組みによるものです。
- 孫プロセス: sleep()もwait()も呼ばないため、即座にメッセージを出力して終了します。
- 第2子プロセス: sleep(1)で1秒待機するため、孫プロセスより後にメッセージを出力します。
- 第1子プロセス: sleep(2)で2秒待機し、さらにwait(NULL)で自分の子(孫プロセス)の終了を待ってからメッセージを出力します。
- 親プロセス: wait(NULL)を2回呼び出して、2つの子プロセスが両方とも終了するのを待ってから、最後にメッセージを出力します。
このように、fork()で生成した複数のプロセスに対してwait()とsleep()を組み合わせることで、プロセスの終了順序を制御し、階層構造の下位から上位へと順番に処理を実行させることができます。
-
C++とOpenCVでデフォルトカメラから映像をキャプチャする方法
この記事では、OpenCVを使ってデフォルトカメラにアクセスし、そのカメラからの映像ストリームを表示する方法を解説します。デフォルトカメラとはノートパソコンの場合、内蔵されているWebカメラがデフォルトカメラになります。一方、デスクトップPCの場合は、カメラが接続されているシリアルポートの順番によってデフォルトカメラが決まります。デフォルトのWebカメラから映像をキャプチャする場合、カメラに関する詳細な知識は必要ありません。カメラが正しく接続されていることだけを確認すればOKです。サンプルコード以下のプログラムは、デフォルトカメラから映像ストリームを取得し、リアルタイムで画面に表示します。#i
-
【C++】システムが処理できるゾンビプロセスの最大数を検証する方法
本記事では、「システムが同時に処理できるゾンビプロセスの最大数はどれくらいか」、言い換えればプログラムがどこまで実行を続けられるのかを、実際のコードで検証していきます。 ゾンビプロセス(defunct process とも呼ばれます)とは、exit() システムコールによってすでに実行を終了しているにもかかわらず、プロセステーブル上にエントリが残り続けているプロセスのことです。通常、子プロセスが終了しても、親プロセスが wait() を呼び出して終了ステータスを読み取らない限り、そのエントリは解放されません。これがゾンビプロセスとして残留する仕組みです。 プログラムで使用するアプローチ プ