我读到使用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
有人可以解释为什么它实际上并没有停止并且不断地为无限循环打印。
答案 0 :(得分:5)
您应该非常仔细地阅读vfork
的手册页:
vfork()函数与fork(2)具有相同的效果,但如果由vfork()创建的进程修改除用于存储返回值的pid_t类型的变量之外的任何数据,则行为未定义。 vfork(),或从调用vfork()的函数返回,或在成功调用_exit(2)或exec(3)函数系列之前调用任何其他函数。
(上面是来自手册页的POSIX部分,因此(可能)适用于Linux以外的其他环境。
您正在调用printf
并从孩子那里返回,因此您的程序行为未定义。