5

我读到使用 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;  
  }

我得到的输出如下:

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

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

Parent  
Child

有人可以解释一下为什么它实际上并没有停止并连续打印无限循环。

4

1 回答 1

5

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

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

(以上来自手册页的 POSIX 部分,因此(可能)适用于 Linux 以外的其他环境)。

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

于 2011-05-20T12:15:08.950 回答