Pré-requisito: forquilha() em C .

Então, quando fazemos um fork(), quais são as seções que os dois processos realmente compartilham?
A memória heap é por processo?
As variáveis ​​globais são compartilhadas?
Malloc retornará o mesmo endereço para ambos?

Vamos executar o programa abaixo e dar uma olhada em sua saída para esclarecer as questões acima.

// C program to demonstrate working of fork()
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>
  
int globalVar; /*  A global variable*/
  
int main(void)
{
    int localVar = 0;
    int* p = (int*) malloc(2);
    pid_t childPID = fork();
  
    // Putting value at allocated address
    *p = 0;
  
    if (childPID >= 0) // fork was successful
    {
        if (childPID == 0) // child process
        {
            printf("\n Child Process Initial Value :: localVar"
                   " = %d, globalVar = %d", localVar,
                   globalVar);
            localVar++;
            globalVar++;
  
            int c = 500;
            printf("\n Child Process :: localVar = %d, "
                   "globalVar = %d", localVar, globalVar);
            printf("\n Address of malloced mem child = %p "
                   "and value is %d", p, *p);
            printf("\n lets change the value pointed my malloc");
  
            *p = 50;
            printf("\n Address of malloced mem child = %p "
                   "and value is %d", p, *p);
            printf("\n lets change the value pointed my "
                   "malloc in child");
  
            *p = 200;
            printf("\n Address of malloced mem child = %p "
                   "and value is %d\n\n\n", p, *p);
        }
        else // Parent process
        {
            printf("\n Parent process Initial Value :: "
                   "localVar = %d, globalVar = %d",
                   localVar, globalVar);
  
            localVar = 10;
            globalVar = 20;
            printf("\n Parent process :: localVar = %d,"
                  " globalVar = %d", localVar, globalVar);
            printf("\n Address of malloced mem parent= %p "
                   "and value is %d", p, *p);
  
            *p = 100;
            printf("\n Address of malloced mem parent= %p "
                   "and value is %d", p, *p);
            printf("\n lets change the value pointed my"
                    " malloc in child");
            *p = 400;
            printf("\n Address of malloced mem child = %p"
                   " and value is %d \n", p, *p);
        }
    }
    else // fork failed
    {
        printf("\n Fork failed, quitting!!!!!!\n");
        return 1;
    }
  
    return 0;
}
 Parent process Initial Value :: localVar = 0, globalVar = 0
 Parent process :: localVar = 10, globalVar = 20
 Address of malloced mem parent= 0x1bb5010 and value is 0
 Address of malloced mem parent= 0x1bb5010 and value is 100
 lets change the value pointed my malloc in child
 Address of malloced mem child = 0x1bb5010 and value is 400 

 Child Process Initial Value :: localVar = 0, globalVar = 0
 Child Process :: localVar = 1, globalVar = 1
 Address of malloced mem child = 0x1bb5010 and value is 0
 lets change the value pointed my malloc
 Address of malloced mem child = 0x1bb5010 and value is 50
 lets change the value pointed my malloc in child
 Address of malloced mem child = 0x1bb5010 and value is 200

Explicação:

  1. Assim, cada filho e pai do processo têm sua própria cópia de globalVariable e localvar, caso contrário, se eles tivessem compartilhado, teríamos "Valor inicial do processo filho::localVar = [10], globalVariable [20]" no processo filho que foi atribuído no processo pai que foi executado primeiro, mas nós não o fizemos.
  2. Embora o endereço de memória retornado por malloc seja o mesmo, mas na verdade eles estão apontando ou mapeados para um endereço físico diferente, caso contrário, quando o pai atribuiu o valor 100 no endereço de memória 0x1535010 o mesmo 100 que deveríamos ter no filho, mas obtivemos 0.

    Este artigo é uma contribuição de Abhilash Kumar Jaiswal . Se você gosta de GeeksforGeeks e gostaria de contribuir, você também pode escrever um artigo usando write.geeksforgeeks.org ou enviar seu artigo para review-team@geeksforgeeks.org. Veja o seu artigo na página principal do GeeksforGeeks e ajude outros Geeks.

    Escreva comentários se encontrar algo incorreto ou se quiser compartilhar mais informações sobre o tópico discutido acima.

    Quer aprender com os melhores vídeos com curadoria e problemas práticos, confira o C Foundation Course for Basic to Advanced C.