ゾンビまたは Linux の「機能していないプロセス」は、完了したプロセスですが、親プロセスと子プロセス間の対応がないため、そのエントリはプロセス テーブルに残っています。通常、親プロセスは、wait() 関数を通じて子プロセスのステータスをチェックします。子プロセスが終了すると、待機関数は親にプロセスをメモリから完全に終了するように通知します。ただし、親プロセスがその子プロセスの待機関数の呼び出しに失敗した場合、子プロセスはシステム内でデッド プロセスまたはゾンビ プロセスとして生きたままになります。これらのゾンビ プロセスは、システム上に大量に蓄積され、そのパフォーマンスに影響を与える可能性があります。
以下は、システム上で Zombie-Process を作成するための C プログラムです。このファイルをzombie.c として保存します。
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main ()
{
pid_t child_pid;
child_pid = fork ();
if (child_pid > 0) {
sleep (60);
}
else {
exit (0);
}
return 0;
}
このコードで作成されたゾンビ プロセスは 60 秒間実行されます。 sleep() 関数で時間 (秒単位) を指定することにより、継続時間を増やすことができます。
このプログラムをコンパイル
gcc zombie.c
ゾンビ プログラムを実行します。
./a.out
ps コマンドもこの機能していないプロセスを表示し、新しいターミナルを開き、以下のコマンドを使用して機能していないプロセスを確認します:
[email protected]:~/process$ ps -ef | grep a.out
aamir 10171 3052 0 17:12 pts/0 00:00:00 ./a.out
aamir 10172 10171 0 17:12 pts/0 00:00:00 [a.out] <defunct> #Zombie process
aamir 10177 3096 0 17:12 pts/2 00:00:00 grep --color=auto a.out
引用:
<ブロック引用>私の理解では、親プロセスが子プロセスの前に終了すると、ゾンビ プロセスが発生します。
これは間違っています。 man 2 wait
によると (注を参照) :
終了したが、待っていなかった子は「ゾンビ」になります。
したがって、ゾンビ プロセスを作成する場合は、fork(2)
の後に 、子プロセスは exit()
である必要があります 、親プロセスは sleep()
である必要があります 終了する前に、 ps(1)
の出力を観察する時間を与えます .
たとえば、あなたの代わりに以下のコードを使用して、 ps(1)
を使用できます sleep()
の間 ing:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(void)
{
pid_t pid;
int status;
if ((pid = fork()) < 0) {
perror("fork");
exit(1);
}
/* Child */
if (pid == 0)
exit(0);
/* Parent
* Gives you time to observe the zombie using ps(1) ... */
sleep(100);
/* ... and after that, parent wait(2)s its child's
* exit status, and prints a relevant message. */
pid = wait(&status);
if (WIFEXITED(status))
fprintf(stderr, "\n\t[%d]\tProcess %d exited with status %d.\n",
(int) getpid(), pid, WEXITSTATUS(status));
return 0;
}