子进程中的变量修改

时间:2014-08-20 20:29:17

标签: c process fork waitpid

我正在研究Bryant和O'Hallaron的Computer Systems, A Programmer's Perspective。练习8.16要求输出类似的程序(我更改了它,因为它们使用了可以在其网站上下载的头文件):

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
int counter = 1;

int main()
{
    if (fork() == 0){
        counter--;
        exit(0);
    }

    else{
        Wait(NULL);
        printf("counter = %d\n", ++counter);
    }
    exit(0);
}

我回答“counter = 1”,因为父进程等待其子进程终止然后递增计数器。但孩子首先减少它。但是,当我测试程序时,我发现正确的答案是“counter = 2”。变量“counter”在子进程和父进程中是否不同?如果没有,那么为什么答案是2?

1 个答案:

答案 0 :(得分:3)

您的父流程以counter的{​​{1}}开头。

然后它等待分叉的子进程完成。

(分叉过程中发生的任何事情都不会影响1的父版本。每个进程都有自己的内存空间;没有共享变量。)

最后,counter语句首先使用printf()运算符递增counter,这使得++获得值counter