5
votes

I read that the new process created using vfork() system call executes as a thread in the parent's address space and until the child thread doesnot calls exit() or exec() system call, the parent is blocked. So I wrote a program using vfork() system call

#include <stdio.h>  
#include <unistd.h>

int main()  
 {  
      pid_t pid;  
      printf("Parent\n");  
      pid = vfork();  
      if(pid==0)  
      {  
          printf("Child\n");  
      }  
      return 0;  
  }

I got the output as follows:

 Parent  
 Child  
 Parent  
 Child  
 Parent  
 Child  
 ....  
 ....  
 ....

I was assuming that the return statement must be calling the exit() system call internally so I was expecting the output as only

Parent  
Child

Can somebody explain me why actually it is not stopping and continuously printing for infinite loop.

1
By the way, vfork() is basically obsolete. It's been ripped from the latest POSIX standard, and with modern copy-on-write semantics, gains you little if any performance or memory savings. Just use fork(). It's plenty fast, works on everything that claims to be *nix-ish, and doesn't put any restrictions on what you can do.Nicholas Knight
The only time vfork is still needed is on wannabe-POSIX MMU-less microcontroller-based junk.R.. GitHub STOP HELPING ICE

1 Answers

5
votes

You should read the man page for vfork very carefully:

The vfork() function has the same effect as fork(2), except that the behavior is undefined if the process created by vfork() either modifies any data other than a variable of type pid_t used to store the return value from vfork(), or returns from the function in which vfork() was called, or calls any other function before successfully calling _exit(2) or one of the exec(3) family of functions.

(above is from the POSIX part of the man page, so applies (potentially) to other environments than Linux).

You're calling printf and returning from the child, so the behavior of your program is undefined.