簡體   English   中英

fork的子進程中的靜態變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM