c - fork子进程中的静态变量

标签 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++”。

最佳答案

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

与线程相比,线程共享相同的进程,即相同的虚拟地址空间,所有线程都会看到变化。

关于c - fork子进程中的静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33319268/

相关文章:

c++ - 该程序是否在所有标准系统上显示四套牌(♠♣♥♦)?

linux - Arch Linux Pacman 监视器

xml - 解压 LAR 文件,编辑 manifest.xml 然后尝试导入 LAR 文件

php - PHP中的静态类初始化器

c# - 我应该为图像和颜色使用公共(public)静态字段吗?

c - 我怎样才能捕获输出?

c - 如何将命令行参数作为字符串参数的一部分传递

c - 使用c语言的telnet客户端,用于自动备份一系列路由器

java - 在kali linux中拾取_JAVA_OPTIONS

java - 为什么Java类加载器执行 "static"内容,例如Class.forName