以下代码永不结束。这是为什么?vfork永无止境
#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()系统调用的子进程来执行父的 地址空间(这可以覆盖父的数据和堆栈),这 暂停父进程,直到子进程退出。
'int main(void)'80年代很久以前。 –
我想我倾向于同意'vfork'上的Linux手册页:“Linux非常不幸地从过去恢复了这个幽灵”。考虑到'fork'(在你可能使用的任何Linux版本中)一个轻量级的操作,我会停止担心'vfork'可能会或可能不会做什么。 –
你的假设有一个错误。 “相反,它共享地址空间。”这是不正确的。它可以共享地址空间,但不一定。一些操作系统只实现挂起父母的'vfork'语义,但仍然像普通的'fork'那样拷贝地址空间。原因是共享地址空间导致了很多错误(我似乎记得某些系统调用malloc和父内存泄漏时的execvp)。 – Art