在这个片段中,(除了倒数第二个之外忽略了所有printf
),我希望counter
在结尾处为1。
int counter = 1; //GLOBAL!
int main()
{
if (fork() == 0) {
printf("child has spoken!\n");
counter--;
printf("and counter is now: %d\n", counter);
exit(0);
}
else {
printf("what is counter here?: %d\n", counter);
printf("now we'll wait\n");
wait(NULL);
printf("we've waited long enough!\n");
printf("counter = %d\n", ++counter);
printf("counter is 2????: %d\n", counter);
}
exit(0);
}
可以在打印到输出的内容中看到该过程。
what is counter here?: 1
now we'll wait
child has spoken!
and counter is now: 0
we've waited long enough!
counter = 2
counter is 2????: 2
首先输入else
,counter
仍为1,我们wait(NULL)
让child
死亡。在if
中备份,fork()
创建了子项,但看到fork() == 0
,只有child
将counter
递减1.现在{{1 }为0,counter
终止于child
。等待结束,exit(0)
已经过时,child
打印parent
应该是0 + 1 = 1,但突然间它是2,而不是1!为什么会这样?
答案 0 :(得分:2)
来自fork
的Linux手册页:
在Linux下,fork()是使用copy-on-write页面实现的,因此它所产生的唯一损失是复制父页面表所需的时间和内存,以及为子项创建唯一的任务结构。
这意味着无论何时在父进程或子进程中写入内存,都会复制正在写入的页面,并且这两个进程最终会有独立的副本。