考虑以下代码:
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()?
没有2本。你打电话时vfork
当孩子做它的事情时,父母冻结了(直到它调用_exit(2)
or execve(2)
)。所以在任何一个时刻,只有一个pid
多变的。
顺便说一句,你所做的事情是不安全的。标准写得很清楚:
vfork() 函数应与 fork() 等效,不同之处在于这
行为未定义如果 vfork() 创建的进程要么
修改除用于存储的 pid_t 类型变量以外的任何数据
vfork() 的返回值,或从其中的函数返回
vfork() 被调用,或者调用任何其他函数成功之前
调用 _exit() 或 exec 系列函数之一。
作为第二个旁注,vfork
已被删除SUSv4
- 使用它确实没有意义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)