为什么这个全球反击不会在子进程中减少?

时间:2016-03-02 18:21:07

标签: c process fork parent-child

在这个片段中,(除了倒数第二个之外忽略了所有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

首先输入elsecounter仍为1,我们wait(NULL)child死亡。在if中备份,fork()创建了子项,但看到fork() == 0,只有childcounter递减1.现在{{1 }为0,counter终止于child。等待结束,exit(0)已经过时,child打印parent应该是0 + 1 = 1,但突然间它是2,而不是1!为什么会这样?

1 个答案:

答案 0 :(得分:2)

来自fork的Linux手册页:

  

在Linux下,fork()是使用copy-on-write页面实现的,因此它所产生的唯一损失是复制父页面表所需的时间和内存,以及为子项创建唯一的任务结构。

这意味着无论何时在父进程或子进程中写入内存,都会复制正在写入的页面,并且这两个进程最终会有独立的副本。