GNU/Linux >> Belajar Linux >  >> Linux

Buat proses zombie

Zombie atau "defunct process" di Linux adalah proses yang telah selesai, tetapi entrinya masih ada di tabel proses karena kurangnya korespondensi antara proses induk dan anak. Biasanya, proses induk terus memeriksa status proses anaknya melalui fungsi wait(). Saat proses anak selesai, fungsi tunggu memberi sinyal kepada orang tua untuk sepenuhnya keluar dari proses dari memori. Namun, jika induk gagal memanggil fungsi tunggu untuk salah satu anaknya, proses anak tetap hidup dalam sistem sebagai proses mati atau zombie. Proses zombi ini mungkin menumpuk, dalam jumlah besar, di sistem Anda dan memengaruhi kinerjanya.

Di bawah ini adalah program c untuk membuat Proses-Zombie di sistem kami. Simpan file ini sebagai 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;
}

Proses zombie yang dibuat melalui kode ini akan berjalan selama 60 detik. Anda dapat menambah durasi waktu dengan menentukan waktu (dalam detik) dalam fungsi sleep().

Kompilasi program ini

gcc zombie.c

Sekarang jalankan program zombie:

./a.out

Perintah ps sekarang juga akan menampilkan proses mati ini, buka terminal baru dan gunakan perintah di bawah ini untuk memeriksa proses mati:

[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

Mengutip:

Menurut pemahaman saya, proses zombie terjadi ketika proses induk keluar sebelum proses anak-anak.

Ini salah. Menurut man 2 wait (lihat CATATAN) :

Seorang anak yang berhenti, tetapi belum ditunggu menjadi "zombie".

Jadi, jika Anda ingin membuat proses zombie, setelah fork(2) , proses anak harus exit() , dan proses induk harus sleep() sebelum keluar, memberi Anda waktu untuk mengamati keluaran dari ps(1) .

Misalnya, Anda dapat menggunakan kode di bawah, bukan milik Anda, dan menggunakan ps(1) sementara 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. Cara mematikan proses zombie di Linux

  2. Membunuh zombie, gaya Linux

  3. Buat Pengguna Sudo di Debian - Proses Langkah demi Langkah?

  1. Bagaimana Membunuh Proses Yang Induknya Init?

  2. Proses Keturunan?

  3. Linux ln perintah

  1. Linux:Temukan dan Bunuh Proses Zombie

  2. buat aturan iptables per proses/layanan

  3. Cara membunuh proses zombie