考虑到以下守则:
int main()
{
int pid;
pid=vfork();
if(pid==0)
printf("child\n");
else
printf("parent\n");
return 0;
}在v叉()的情况下,父进程和子进程使用的入口空间是相同的,因此应该存在变量pid的单个副本。现在,我无法理解这个pid变量如何能够有两个由v叉()返回的值,即子变量为零,父变量为非零。
在()的情况下,入口空间也会被复制,并且每个子程序和父级中都有两个pid变量的副本,所以在这种情况下,我可以理解两个不同的副本可以有由()返回的不同值,但是在vfork()的情况下,无法理解pid是如何有两个由vfork()返回的值的。
发布于 2012-02-19 09:06:05
没有两份副本。当您调用vfork时,父节点会结冰(直到它调用_exit(2)或execve(2))。因此,在任何时刻,只有一个pid变量。
顺便说一句,你正在做的事情是不安全的。The standard把它拼得很清楚:
的vfork()函数应该等同于(),除非行为是未定义的,如果由vfork()创建的进程修改了用于存储vfork()返回值的pid_t类型的变量以外的任何数据,或者从调用vfork()的函数返回,或者在成功调用_exit()或exec系列函数之前调用任何其他函数。
作为第二个注意事项,vfork已经从SUSv4中删除了--使用它真的是没有意义的。
https://stackoverflow.com/questions/9347928
复制相似问题