gpt4 book ai didi

c - vfork 永无止境

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

下面的代码永远不会结束。这是为什么?

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#define SIZE 5
int nums[SIZE] = {0, 1, 2, 3, 4};
int main()
{
int i;
pid_t pid;
pid = vfork();
if(pid == 0){ /* Child process */
for(i = 0; i < SIZE; i++){
nums[i] *= -i;
printf(”CHILD: %d “, nums[i]); /* LINE X */
}
}
else if (pid > 0){ /* Parent process */
wait(NULL);
for(i = 0; i < SIZE; i++)
printf(”PARENT: %d “, nums[i]); /* LINE Y */
}
return 0;
}

更新:

这段代码只是为了说明我对 vfork() 的一些困惑。似乎当我使用 vfork() 时,子进程不会复制父进程的地址空间。相反,它共享地址空间。在那种情况下,我希望两个进程都更新 nums 数组,我的问题是按什么顺序?操作系统如何在两者之间同步?

至于为什么代码永远不会结束,可能是因为我没有任何_exit()exec() 明确退出的语句。我说得对吗?

更新 2:
我刚读到:56. Difference between the fork() and vfork() system call?我认为这篇文章帮助我解决了我的第一个困惑。

The child process from vfork() system call executes in the parent’s address space (this can overwrite the parent’s data and stack ) which suspends the parent process until the child process exits.

最佳答案

引用 vfork(2) 手册页:

The vfork() function has the same effect as fork(), except that the behaviour 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() 而不是 fork()

关于c - vfork 永无止境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14480053/

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