Zombie nebo "zaniklý proces" v Linuxu je proces, který byl dokončen, ale jeho záznam stále zůstává v tabulce procesů kvůli nedostatečné shodě mezi nadřazeným a podřízeným procesem. Nadřazený proces obvykle kontroluje stav svých podřízených procesů pomocí funkce wait(). Po dokončení podřízeného procesu funkce čekání signalizuje rodiči, aby zcela opustil proces z paměti. Pokud však rodič nedokáže zavolat funkci čekání pro některého ze svých potomků, podřízený proces zůstane v systému živý jako mrtvý nebo zombie proces. Tyto zombie procesy se mohou nahromadit ve velkém množství ve vašem systému a ovlivnit jeho výkon.
Níže je uveden program c pro vytvoření procesu zombie v našem systému Uložte tento soubor jako 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;
}
Proces zombie vytvořený tímto kódem poběží 60 sekund. Dobu trvání můžete prodloužit zadáním času (v sekundách) ve funkci sleep().
Zkompilujte tento program
gcc zombie.c
Nyní spusťte zombie program:
./a.out
Příkaz ps nyní také zobrazí tento zaniklý proces, otevře nový terminál a pomocí níže uvedeného příkazu zkontroluje zaniklý proces:
[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
Cituji:
Pokud tomu rozumím, proces zombie nastane, když rodičovský proces skončí dříve, než proces potomků.
To je špatně. Podle man 2 wait
(viz POZNÁMKY):
Dítě, které skončí, ale nebylo na něj čekáno, se stane „zombie“.
Pokud tedy chcete vytvořit zombie proces, po fork(2)
, podřízený proces by měl exit()
a nadřazený proces by měl sleep()
před ukončením, což vám dává čas sledovat výstup ps(1)
.
Můžete například použít níže uvedený kód místo svého a použít ps(1)
zatímco 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;
}