fork的子进程中的静态变量

时间:2015-10-24 14:28:27

标签: c linux static fedora

我理解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);

}
}

输出:

enter image description here

为什么在父printf语句中y的值是99?虽然父母等待孩子完成,但在孩子中,y的值在设置为99后变为100“y ++”。

2 个答案:

答案 0 :(得分:2)

这是因为y存在于两个独立的进程中,即两个独立的虚拟地址空间。更改一个流程不会影响其他流程。

将此与线程进行比较,其中线程共享相同的进程,即相同的虚拟地址空间,所有线程都将看到更改。

答案 1 :(得分:1)

静态变量在加载时(编译时)初始化,而不是在运行时初始化。在fork()中,复制了内存映像,包括这些初始化的静态变量。孩子执行增量,父母没有。