L.p*_*ppt 6 c operating-system system-calls systems-programming
考虑以下代码:
int main()
{
int pid;
pid=vfork();
if(pid==0)
printf("child\n");
else
printf("parent\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在vfork()的情况下,父进程和子进程使用的地址空间是相同的,因此应该存在变量pid的单个副本.现在我无法理解这个pid变量如何具有vfork()返回的两个值,即,对于子项为零而对于父项为非零?
在fork()的情况下,地址空间也被复制,每个子节点和父节点中都有两个pid变量副本,所以我可以理解在这种情况下,两个不同的副本可以有fork()返回的不同值,但是无法理解在vfork()的情况下,pid如何具有vfork()返回的两个值?
没有2份.当你vfork的孩子做了事情时(直到它打电话_exit(2)或者execve(2)),你给父母冻结了.所以在任何一个时刻,只有一个pid变量.
作为旁注,你正在做的是不安全的.标准清楚地说明了这一点:
vfork()函数应该等效于fork(),除非如果vfork()创建的进程修改除了用于存储vfork()的返回值的pid_t类型的变量之外的任何数据,则该行为是未定义的,或者从调用vfork()的函数返回,或在成功调用_exit()或exec 函数系列之前调用任何其他函数.
作为第二个附注,vfork已被删除SUSv4- 使用它真的没有意义.