[英]Static variable in child process of fork
我理解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 ++”。
這是因為y
存在於兩個獨立的進程中,即兩個獨立的虛擬地址空間。 更改一個流程不會影響其他流程。
將此與線程進行比較,其中線程共享相同的進程,即相同的虛擬地址空間,所有線程都將看到更改。
靜態變量在加載時(編譯時)初始化,而不是在運行時初始化。 在fork()中,復制了內存映像,包括這些初始化的靜態變量。 孩子執行增量,父母不執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.