我理解fork()中的父和子都是两个独立的进程,但我试图理解静态变量在子进程中声明和初始化时的行为。请考虑以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
static int z = 99;
void main(){
int x=99;
int pid;
pid = fork();
switch(pid){
case -1: printf("fork failed.");break;
case 0: printf("I am the Child[PID=%d].\n",getpid());
static int y=99;
x++;y++;z++;
printf("x=%d, y=%d, z=%d\n",x,y,z);break;
default: wait(NULL);
//int y = 99;
printf("Child has finished. I am the parent[PID=%d].\n",getpid());
printf("x=%d, y=%d, z=%d\n",x,y,z);
}
}
输出:
为什么在父printf语句中y的值是99?虽然父母等待孩子完成,但在孩子中,y的值在设置为99后变为100“y ++”。
答案 0 :(得分:2)
这是因为y
存在于两个独立的进程中,即两个独立的虚拟地址空间。更改一个流程不会影响其他流程。
将此与线程进行比较,其中线程共享相同的进程,即相同的虚拟地址空间,所有线程都将看到更改。
答案 1 :(得分:1)
静态变量在加载时(编译时)初始化,而不是在运行时初始化。在fork()中,复制了内存映像,包括这些初始化的静态变量。孩子执行增量,父母没有。