GNU/Linux >> Znalost Linux >  >> Linux

Vytvořte proces zombie

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

Linux
  1. Jak zabít proces zombie na Linuxu

  2. Co jsou zombie procesy a jak najít a zabít zombie procesy?

  3. Zabíjení zombie, styl Linuxu

  1. Vytvořit uživatele Sudo na Debianu – proces krok za krokem?

  2. Jak zabít proces, jehož rodič je init?

  3. Procesní potomci?

  1. Příkaz Linux ln

  2. Vytvořte server DNS

  3. Linux:Najděte a zabijte zombie procesy