単一のCプログラムでゾンビプロセスと孤立プロセスを同時に実行する方法
この記事では、C/C++の単一プログラム内でゾンビプロセスと孤立(オーファン)プロセスを同時に実行する方法を解説します。本題に入る前に、まずゾンビプロセスと孤立プロセスとは何かを確認しておきましょう。
ゾンビプロセスとは
ゾンビプロセスとは、実行自体はすでに完了しているにもかかわらず、プロセステーブル上にエントリが残っているプロセスのことです。ゾンビプロセスは主に子プロセスで発生します。親プロセスが子プロセスの終了ステータスを読み取る必要があるためです。waitシステムコールによってこの読み取りが完了すると、ゾンビプロセスはプロセステーブルから削除されます。これを「ゾンビプロセスの回収(reaping)」と呼びます。
孤立プロセス(オーファンプロセス)とは
孤立プロセスとは、親プロセスが終了または完了した後も実行を続けているプロセスのことです。孤立プロセスには、意図的に発生するケースと意図せず発生するケースがあります。
意図的に孤立させたプロセスは、手動の操作なしにバックグラウンドで動作します。これは通常、無期限に稼働し続けるサービスを起動したり、ユーザーの監視なしに長時間のジョブを完遂させたりするために利用されます。
一方、意図しない孤立プロセスは、親プロセスがクラッシュまたは終了した際に生まれます。このような意図しない孤立プロセスは、プロセスグループの仕組みを利用することで回避できます。
ゾンビプロセスと孤立プロセスを同時に発生させる
次のコードでは、ゾンビプロセスと孤立プロセスを同時に実行します。ここでは、親プロセスがあり、その親には子プロセス、さらにその子には孫プロセスが存在する3階層の構造になっています。
処理が子プロセス側に入ると、まず5秒間スリープします。この間にメインの親プロセスは終了するため、子プロセスは孤立プロセスとなります。その後、子プロセスはfork()によって孫プロセスを生成します。孫プロセスはメッセージを表示してすぐに実行を終えますが、親である子プロセスは無限ループに入っておりwait()を呼び出さないため、孫プロセスは終了ステータスを回収されず、ゾンビプロセスとしてプロセステーブルに残り続けます。
サンプルコード
#include <stdio.h>
#include <unistd.h>
int main() {
int x = fork(); // 子プロセスを作成
if (x > 0) // xが0以外の場合は親プロセス
printf("Inside Parent---- PID is : %d\n", getpid());
else if (x == 0) { // 子プロセスではxは0になる
sleep(5); // しばらく待機
x = fork();
if (x > 0) {
printf("Inside Child---- PID :%d and PID of parent : %d\n", getpid(), getppid());
while(1)
sleep(1);
printf("Inside Child---- PID of parent : %d\n", getppid());
}else if (x == 0)
printf("Inside grandchild process---- PID of parent : %d\n", getppid());
}
return 0;
}
実行結果
soumyadeep@soumyadeep-VirtualBox:~$ ./a.out
Inside Parent---- PID is : 3821
soumyadeep@soumyadeep-VirtualBox:~$ Inside Child---- PID :3822 and PID of parent : 686
Inside grandchild process---- PID of parent : 3822
soumyadeep@soumyadeep-VirtualBox:~$
実行結果を見ると、親プロセスは即座に終了しているため、子プロセスの親PID(getppid()の戻り値)が元の親ではなく別のプロセス(initなど)に変わっていることが確認できます。これが孤立プロセスの特徴です。また、孫プロセスは終了しても回収されないため、psコマンドなどで状態が「Z(zombie)」として表示されることを確認できます。
-
デスクトップのショートカットとは?仕組みから作り方まで徹底解説
デスクトップに並ぶショートカットアイコンが、実際にはどうやって動いているのか、疑問に思ったことはありませんか?ショートカットはパソコン上の他のファイルとは少し違う挙動をします。実はこれにはちゃんとした理由があり、ショートカットは他のファイルとは異なる特別なファイルだからなのです。 この記事では、ショートカットがなぜ特別なのか、そしてその仕組みについて詳しく解説していきます。 ショートカットとは何か? ショートカットとは、コンピューターに対して「特定のファイルを開け」という指示を伝えるための一連の命令のことです。ショートカットを起動すると、その命令がコンピューターに渡され、対象のファイルが探し出
-
WindowsでプログラムのCPU使用率を制限する3つの方法【タスクマネージャー・Process Lasso】
PCのCPU使用率を常に把握しておくことは非常に重要です。CPUに過度な負荷がかかると、スロットリングが発生し、PC全体のパフォーマンス低下につながる可能性があります。これは日常的な作業にも大きな影響を与えるため、バックグラウンドで動作している重要度の低いプログラムがCPUリソースを占有していないか、必ず確認するようにしましょう。本記事では、必要以上にCPUを消費するプログラムに対処するためのさまざまな方法をご紹介します。CPUはコンピューターの中でも最も重要なパーツの一つです。中には非常に多くのリソースを要求し、利用可能なリソースをすべて奪おうとするプログラムも存在します。前述の通り、このよ