【发布时间】:2012-03-10 00:20:41
【问题描述】:
考虑以下代码:
int main()
{
int pid;
pid=vfork();
if(pid==0)
printf("child\n");
else
printf("parent\n");
return 0;
}
在vfork()的情况下,父进程和子进程使用的地址空间相同,所以变量pid的单个副本应该在那里。现在我无法理解这个 pid 变量如何具有 vfork() 返回的两个值,即子级为零,父级非零?
在 fork() 的情况下,地址空间也会被复制,并且每个孩子和父母都有两个 pid 变量的副本,所以我可以理解在这种情况下,两个不同的副本可以有不同的值fork() 返回,但在 vfork() 的情况下无法理解 pid 如何具有 vfork() 返回的两个值? p>
【问题讨论】:
-
@JonathanLeffler:
vfork()对于无 MMU 系统非常有用。 -
是的,先生,我同意你的观点,我们不应该使用它,但我使用 vfork 来解决创建进程树和不同级别树的进程之间通信的一个问题,在这种情况下 vfork 很有用取一些全局变量。我会保留你的建议。
-
@L.ppt:嗯。不,这是对 vfork() 的不好使用。最好使用一些真正的 IPC(共享内存、套接字、管道……),或者,如果您真的知道自己在做什么,可以使用线程。
-
我会翻译 R.. 的评论:
vfork()对于从 Java 生成进程很有用(你还能在哪里找到如此大的地址空间浪费?),而且确实 Java 1.7 似乎有添加了对vfork()和posix_spawn()的支持。
标签: c operating-system system-calls systems-programming