vfork() system call

2019-05-04 08:37发布

问题:

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:

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.