fork() e processos p / w compartilhados de memória criados usando-o
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:
- 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.
- 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.
As postagens do blog Acervo Lima te ajudaram? Nos ajude a manter o blog no ar!
Faça uma doação para manter o blog funcionando.
70% das doações são no valor de R$ 5,00...
Diógenes Lima da Silva