我正在研究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?
答案 0 :(得分:3)
您的父流程以counter
的{{1}}开头。
然后它等待分叉的子进程完成。
(分叉过程中发生的任何事情都不会影响1
的父版本。每个进程都有自己的内存空间;没有共享变量。)
最后,counter
语句首先使用printf()
运算符递增counter
,这使得++
获得值counter
。