vfork()系统调用

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

#include  #include  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 

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

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

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

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

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