fork child 进程中的静态变量
Static variable in child process of fork
我知道 fork() 中的 parent 和 child 都是两个独立的进程,但我试图了解静态变量在 [= 中声明和初始化时的行为22=]。请考虑此代码:
#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);
}
}
输出:
为什么在parent printf语句中y的值为99?尽管 parent 等待 child 完成,并且在 child 中,y 的值在设置为 99 后更改为 100 "y++"。
静态变量在加载时(编译时)初始化,而不是 运行 时。在 fork() 中,内存映像被复制,包括这些初始化的静态变量。子执行增量,父不执行。
这是因为y
存在于两个独立的进程中,即两个独立的虚拟地址space。更改一个进程不会影响另一个进程。
将此与线程进行比较,其中线程共享相同的进程,即相同的虚拟地址 space,所有线程都会看到更改。
我知道 fork() 中的 parent 和 child 都是两个独立的进程,但我试图了解静态变量在 [= 中声明和初始化时的行为22=]。请考虑此代码:
#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);
}
}
输出:
为什么在parent printf语句中y的值为99?尽管 parent 等待 child 完成,并且在 child 中,y 的值在设置为 99 后更改为 100 "y++"。
静态变量在加载时(编译时)初始化,而不是 运行 时。在 fork() 中,内存映像被复制,包括这些初始化的静态变量。子执行增量,父不执行。
这是因为y
存在于两个独立的进程中,即两个独立的虚拟地址space。更改一个进程不会影响另一个进程。
将此与线程进行比较,其中线程共享相同的进程,即相同的虚拟地址 space,所有线程都会看到更改。