Home > database >  fork() and wait() in C
fork() and wait() in C

Time:03-07

I am trying to learn the fork() and wait() system calls. If I run this code :

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


int main (){

printf("Hi, I am the parent with pid %d \n ",getpid());

int rc = fork();

printf("Fork returned :   %d \n ",rc);

printf("I am the process with pid %d \n ",getpid());

wait(NULL);
return 0;
}

I get the output as expected on the terminal :

Hi, I am the parent with pid 3639 
 Fork returned :   3640 
 I am the process with pid 3639 
 Fork returned :   0 
 I am the process with pid 3640 

However , If I remove wait(NULL) , I get a strange output on the terminal :

    Hi, I am the parent with pid 3715 
     Fork returned :   3716 
     I am the process with pid 3715 
     John@John-VirtualBox:~/Fork5$  Fork returned :   0 
     I am the process with pid 3716 

I totally understand that , we use wait() to make the parent process waits for the child to end executiion so that we can remove it from the process table and deallocate its PID . But here , if I remove the wait , we see that the terminal is called again :

         John@John-VirtualBox:~/Fork5$  Fork returned :   0 
         I am the process with pid 3716  

And even it doesn't return again back . I don't understand what this have to do with the functionality of wait ? Or in other words , why wait will fix this issue ?

CodePudding user response:

The sequence of events appears to be:

  1. The shell is the parent process to your program. When it forks your program your program inherits the standard streams (to the terminal).

  2. Your program forks a child process which also inherits the standard streams (to the terminal).

  3. When your parent process terminates, the shell notices (because it is waiting) and issues a prompt to the terminal.

  4. However, your program’s child has not yet terminated, so after the shell issues its prompt the child prints its output (and then terminates).

You will notice that the shell does not issue a second prompt after the child terminates. (The shell does not know anything about your child process.)

Order of output

The fact that you get complete output lines (instead of anything interleaved) is because the standard streams for all processes are in line oriented mode.

However, there is no guarantee of order between processes. The OS scheduler can order them any way it wants. Your child could have printed before the parent.

:O)

  • Related