zsl*_*ius 2 c linux fork 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;
}
Run Code Online (Sandbox Code Playgroud)
更新:
这段代码只是为了说明我遇到的一些困惑vfork().看起来当我使用时vfork(),子进程不会复制父进程的地址空间.相反,它共享地址空间.在这种情况下,我希望nums数组可以通过这两个进程更新,我的问题是以什么顺序?操作系统如何在两者之间同步?
至于为什么代码永远不会结束,可能是因为我没有明确的退出任何_exit()或exec()声明.我对吗?
UPDATE2:
我刚读过:56.fork ()和vfork()系统调用之间的区别?
我认为这篇文章帮助我解决了我的第一个困惑.
来自的vfork()系统调用的子进程的父进程的地址空间执行(这可以覆盖父的数据和堆栈),它暂停父进程,直到子进程退出.
引用vfork(2)手册页:
vfork()函数与fork()具有相同的效果,除非如果vfork()创建的进程修改除了用于存储vfork()的返回值的pid_t类型的变量之外的任何数据,则行为未定义,或者从调用vfork()的函数返回,或者在成功调用_exit()或exec函数系列之前调用任何其他函数.
你正在做很多这样的事情,所以你不应该期望它能够发挥作用.我认为这里真正的问题是:你为什么要使用vfork()而不是fork()?
| 归档时间: |
|
| 查看次数: |
3324 次 |
| 最近记录: |