我不知道它是如何工作的。fork 系统调用将父进程分成两个进程,它为子进程返回零。根据我的说法,子进程的输出应该是 glb=101.var=89。但是我错了。有人可以解释一下它是如何工作的吗?
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int glb=100;
int main()
{
int pid;
int var =88;
printf ("Before Fork\n");
pid=fork();
if(pid <0)
{
perror("fork");
exit(1);
}
if(pid ==0) /**child**/
{
glb++;var++;
}
else
{
sleep(5);
}
printf("pid= %d,glb=%d,var=%d\n",getpid(),glb,var);
return 0;
}
最佳答案
当进程 fork 时,它的地址空间被克隆,所以会有一个带有主线程堆栈的段(var
所在的位置)但是有两个进程引用它:
+-------+
parent ---> | var | <--- child
+-------+
同样适用于 glb
所在的数据段。
当它们中的任何一个试图修改它时,就会生成一个写时复制页面错误,并且数据段正在被操作系统复制:
+--------+ var++
parent ---> | 88 | <--- child
+--------+
Handle cow-fault:
+--------+ +--------+
parent ---> | 88 | child ---> | 88 |
+--------+ +--------+
Restart from same instruction:
+--------+ var++ +--------+
parent ---> | 88 | child ----> | 88 |
+--------+ +--------+
+--------+ printf +--------+
parent ---> | 88 | child ----> | 89 |
+--------+ +--------+
所以 child 应该打印 101 和 89,而 parent 应该打印 100 和 88。
关于c - fork 调用子进程和父进程后,值会有什么不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35660564/