AMH9
AMH9

Reputation: 179

Static variable in child process of fork

I understand that both parent and child in fork() are two separated processes, but I was trying to understand the behavior of a static variable when it's declared and initialized in the child. Consider this code please:

#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);

}
}

Output:

enter image description here

Why in parent printf statement the value of y is 99? although that the parent waited for the child to finish, and in the child the value of y is changed to 100 "y++" after it was set to 99.

Upvotes: 2

Views: 3204

Answers (2)

user1129665
user1129665

Reputation:

This is because y exists in two separate processes, i.e. two separate virtual address spaces. Changing one process won't affect the other process.

Compare this with threads, where threads share the same process, i.e. the same virtual address space, change will be seen by all threads.

Upvotes: 2

Paul Ogilvie
Paul Ogilvie

Reputation: 25286

Static variables are initialized at load time (compile time), not at run time. In the fork(), the memory image is copied, including these initialized static vaiables. The child performs the increment, the parent not.

Upvotes: 1

Related Questions