vfork()系统调用

pra*_*tri 5 c fork systems-programming

我读到使用vfork()系统调用创建的新进程作为父地址空间中的线程执行,直到子线程不调用exit()或exec()系统调用,父进程被阻塞.所以我用vfork()系统调用编写了一个程序

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

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

我得到的输出如下:

 Parent  
 Child  
 Parent  
 Child  
 Parent  
 Child  
 ....  
 ....  
 ....
Run Code Online (Sandbox Code Playgroud)

我假设return语句必须在内部调用exit()系统调用,所以我只期望输出

Parent  
Child
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么实际上它不会停止并持续打印无限循环.

Mat*_*Mat 5

您应该vfork仔细阅读该手册页:

vfork()函数与fork(2)具有相同的效果,除非如果vfork()创建的进程修改除了用于存储vfork()的返回值的pid_t类型的变量之外的任何数据,则行为未定义. ,或从调用vfork()的函数返回,或在成功调用_exit(2)或exec(3)函数系列之前调用任何其他函数.

(上面是来自手册页的POSIX部分,因此(可能)适用于除Linux之外的其他环境).

您正在调用printf并从子进程返回,因此您的程序行为未定义.