Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can this C code create zombie processes?

I am wondering if the following code can create zombies:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(){
    int i=1;
    pid_t p;
    p = fork();
    i++;
    if(p!=0){
        waitpid(p, NULL, 0);
    }
    printf("%d\n",i);
    return 0;
}

So, the parent process calls the waitpid for the child process, which returns immediately if the child has not already exited. So, no zombies can arise so far. But, if the child exits before

return 0;
command this would be a zombie then? I am actually confused about it. Should the waitpid be the last line of code before the program terminates? Any help would be appreciated. Thanks!
like image 496
mgus Avatar asked Dec 15 '13 19:12

mgus


People also ask

How can you create a zombie process?

To see a zombie process, you need to make the child exit while the parent is still alive but hasn't waited on the child. If you just change line 10 of your code from if (child_pid > 0) to if (child_pid == 0) , it will "fix" your code and you'll be able to see a zombie process when the child process exits.

How zombie process can be prevented demonstrate using C program?

C. 2. By ignoring the SIGCHLD signal: When a child is terminated, a corresponding SIGCHLD signal is delivered to the parent, if we call the 'signal(SIGCHLD,SIG_IGN)', then the SIGCHLD signal is ignored by the system, and the child process entry is deleted from the process table. Thus, no zombie is created.

What is zombie process in operating system?

On Unix and Unix-like computer operating systems, a zombie process or defunct process is a process that has completed execution (via the exit system call) but still has an entry in the process table: it is a process in the "Terminated state".

How can you see the zombie process?

Zombie processes can be found easily with the ps command. Within the ps output there is a STAT column which will show the processes current status, a zombie process will have Z as the status. In addition to the STAT column zombies commonly have the words <defunct> in the CMD column as well.


1 Answers

The child only becomes a zombie if it ends and the parent doesn't call wait*() as long as itself lives on.

In the moment the parent also ends the child is reaped by the init process which will take care to call wait*() on the child, so it will finally end and with this leave the zombie state and disappears from the process list.

To provoke the child created in your example code to become a zombie modify the code for example as follows:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(void) 
{
    pid_t p = fork();

    if (p != 0) 
    {
        waitpid(p, NULL, 0); /* See if the child already had ended. */
        sleep(1); /* Wait 1 seconds for the child to end. And eat away the SIGCHLD in case if arrived. */
        pause(); /* Suspend main task. */
    }
    else
    {
        sleep(3); /* Just let the child live for some tme before becoming a zombie. */
    }

    return 0;
}

Due to the two following facts:

  • the child sleeps for 3s so the parent's call to waitpid() most probably will always fail
  • the default handling of SIGCHLD is to ignrore it.

the code above in fact is the same as:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(void) 
{
    pid_t p = fork();

    if (p != 0) 
    {
        pause(); /* Suspend main task. */
    }
    else
    {
        sleep(3); /* Just let the child live for some tme before becoming a zombie. */
    }

    return 0;
}
like image 68
alk Avatar answered Sep 30 '22 04:09

alk