Fork

    Zombie Task

    Definition: En informatique, sous les systèmes de type UNIX et similaires, zombie (on utilise plutôt l'orthographe anglaise) est un terme désignant un processus qui s'est achevé, mais qui dispose toujours d'un identifiant de processus (PID) et reste donc encore visible dans la table des processus. On parle aussi de processus défunt.

    Au moment de la terminaison d'un processus, le système désalloue les ressources que possède encore celui-ci mais ne détruit pas son bloc de contrôle. Le système passe ensuite l'état du processus à la valeur TASK_ZOMBIE (représenté généralement par un Z dans la colonne « statut » lors du listage des processus par la commande ps). Le signal SIGCHLD est alors envoyé au processus père du processus qui s'est terminé, afin de l'informer de ce changement. Dès que le processus père a obtenu le code de fin du processus achevé au moyen des appels systèmes wait ou waitpid, le processus terminé est définitivement supprimé de la table des processus.

    Source

    Examples

    Sample

    #include `<stdio.h>`
    #include `<unistd.h>`
    
    int main()
    {
            pid_t pid;
            pid = fork();
    
    
            if(pid == -1)
                    perror("fork() can't be created");
    
            // I'm child
            if(pid == 0)
                    printf("I'm child !\n");
            else
                    printf("I'm father, and i create child with pid '%d'\n", pid);
    }
    

    Output:

    I'm father, and i create child with pid '5367'
    I'm child !
    

    Zombie Task

    #include `<stdio.h>` /* printf() */
    
    #include `<unistd.h>` /* fork(), perror() */
    #include `<stdlib.h>` /* exit() */
    
    int main()
    {
            pid_t pid;
            pid = fork();
    
            if(pid == -1)
                    perror("fork() can't be created");
    
            /* I'm child */
            if(pid == 0)
            {
                    printf("%d: I'm child !\n", getpid());
                    exit(2);
            } else
            {
                    printf("%d: I'm father, and i create child with pid '%d'\n", getpid(), pid);
                    pause(); /* father will never stop without CTRL+C */
            }
    }
    
    parmentier@e201pc03:~$ ./zombie
    6106: I'm father, and i create child with pid '6107'
    6107: I'm child !
    
    parmentier@e201pc03:~$ ps aux | grep zombie
    parment+  6106  0.0  0.0   4196   352 pts/1    S+   09:17   0:00 ./zombie
    parment+  6107  0.0  0.0      0     0 pts/1    Z+   09:17   0:00 [zombie] `<defunct>`
    

    Note: the child with pid 6107 have Z+ status which represent Zombie task.

    Following Child Exit

    #include `<stdio.h>` /* printf() */
    
    #include `<unistd.h>` /* fork(), perror() */
    #include `<stdlib.h>` /* exit() */
    
    int main()
    {
            pid_t pid, wait_pid;
            int status;
    
            pid = fork();
    
    
            if(pid == -1)
                    perror("fork() can't be created");
    
            /* I'm child */
            if(pid == 0)
            {
                    printf("%d: I'm child !\n", getpid());
                    exit(2);
            } else
            {
                    printf("%d: I'm father, and i create child with pid '%d'\n", getpid(), pid);
    
                    do {
    
                            /* retrieve status of any child  */
                            wait_pid = wait(&status);
    
                            if(wait_pid == -1)
                            {
                                    perror("wait() error");
                                    exit(1);
                            }
    
                            /* Check child is ending */
                            if(WIFEXITED(status))
                                    printf("%d: retrieve pid(%d), killed with status %d\n", getpid(), wait_pid, WEXITSTATUS(status));
    
                    } while(!WIFEXITED(status));
    
                    printf("%d: End of father processus.\n", getpid());
                    exit(EXIT_SUCCESS);
            }
    }
    

    Output:

    5864: I'm father, and i create child with pid '5865'
    5865: I'm child !
    5864: retrieve pid(5865), killed with status 2
    5864: End of father processus.
    

    See man 2 wait example, to know more.