【发布时间】:2011-05-20 12:09:25
【问题描述】:
我读到使用 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
有人可以解释一下为什么它实际上并没有停止并连续打印无限循环。
【问题讨论】:
-
顺便说一句,
vfork()基本上已经过时了。它是从最新的 POSIX 标准中剥离出来的,并且具有现代的写时复制语义,即使有任何性能或内存节省,也不会为您带来什么好处。只需使用fork()。它速度非常快,适用于所有声称是 *nix-ish 的东西,并且对您可以做的事情没有任何限制。 -
唯一仍然需要
vfork的时间是在wannabe-POSIX MMU-less 基于微控制器的垃圾上。
标签: c fork systems-programming