【问题标题】:Static variable in child process of forkfork子进程中的静态变量
【发布时间】:2015-10-24 14:28:27
【问题描述】:

我知道 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++”。

【问题讨论】:

    标签: c linux static fedora


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 第一次听到这样的事情,我去搜索一下,thnx。
      猜你喜欢
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 2012-09-30
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      相关资源
      最近更新 更多