gpt4 book ai didi

c - vfork() 系统调用中的返回值

转载 作者:太空狗 更新时间:2023-10-29 17:23:05 24 4
gpt4 key购买 nike

考虑以下代码:

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)execve(2))。所以在任何时候,都只有一个 pid 变量。

附带说明一下,您所做的是不安全的。 The standard拼写清楚:

The vfork() function shall be equivalent to fork(), except that the behavior is undefined if the process created by vfork() either modifies any data other than a variable of type pid_t used to store the return value from vfork(), or returns from the function in which vfork() was called, or calls any other function before successfully calling _exit() or one of the exec family of functions.

作为第二个旁注,vfork 已从 SUSv4 中删除 - 使用它真的没有意义。

关于c - vfork() 系统调用中的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9347928/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com