以下代码永无止境。这是为什么?
#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()
语句。我对吗?UPDATE2:
我刚读:56. Difference between the fork() and vfork() system call?
我认为这篇文章对我的第一次困惑有所帮助。
最佳答案
不要使用vfork
。这是您可以获得的最简单的建议。 vfork
给您的唯一一件事就是暂停父级,直到子级调用exec*
或_exit
为止。关于共享地址空间的部分是不正确的,某些操作系统则这样做,而另一些则选择不这样做,因为它非常不安全并且已导致严重的错误。
上次我查看了应用程序实际上如何使用vfork
时,绝对多数错误了。太糟糕了,我放弃了6个字符的更改,从而无法在当时正在使用的操作系统上共享地址空间。几乎所有使用vfork
的人至少都会泄漏内存,如果不是更糟的话。
如果您真的想使用vfork
,除了在子进程返回后立即调用_exit
或execve
,不要做任何其他事情。除此之外,您正在输入未定义的区域。我的意思是“任何东西”。您开始解析您的字符串以为exec调用做参数,并且可以完全保证某些东西会碰到本不该碰的东西。我的意思是execve
,而不是exec系列的其他功能。许多libc都在execvp
,execl
,execle
等中执行在vfork
上下文中不安全的操作。
您的示例中具体发生了什么:
关于c - vfork永无止境,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14480053/