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;
}