GNU/Linux >> Linux の 問題 >  >> Linux

ゾンビプロセスの作成

ゾンビまたは 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;
}

Linux
  1. ゾンビプロセスとは何ですか?ゾンビプロセスを見つけて殺す方法は?

  2. 親が初期化されているプロセスを強制終了する方法は?

  3. プロセスの子孫?

  1. Linuxlnコマンド

  2. DNSサーバーを作成する

  3. pthread_exit と return

  1. Linuxでゾンビプロセスを強制終了する方法

  2. Linuxでゾンビプロセスを見つけて殺す方法

  3. ゾンビプロセスを強制終了する方法