les données sont-elles partagées entre les processus lorsque nous utilisons fork en c?

Dans ce programme C, les données ne sont pas partagées entre processus, processus parent et processus enfant. child a ses propres données et le parent a ses propres données, mais le pointeur affiche la même adresse pour les deux processus. Comment cela se fait sur le fond? Fork génère-t-il des copies des mêmes données? si c’est le cas, nous avons la même adresse de pointeur pour les deux processus. Ou est-ce dû aux données allouées statiquement qui sont copiées pour chaque processus et les données sont indépendantes pour chaque processus? Je veux savoir comment c’est fait?

#include #include #include int main() { //Static Array int X[] = {1,2,3,4,5}; int i, status; //The fork call int pid = fork(); if(pid == 0) //Child process { //Child process modifies Array for(i=0; i<5; i++) X[i] = 5-i; //Child prints Array printf("Child Array:\t"); for(i=0; i<5; i++) printf("%d\t", X[i]); printf("\nArray ptr = %p\n", X); } else //Parent process { // Wait for the child to terminate and let // it modify and print the array waitpid(-1, &status, 0); //Parent prints Array printf("Parent Array:\t"); for(i=0; i<5; i++) printf("%d\t", X[i]); printf("\nArray ptr = %p\n", X); } return 0; } 

Voici la sortie du programme.

  1 Child Array: 5 4 3 2 1 2 Array ptr = 0x7fff06c9f670 3 Parent Array: 1 2 3 4 5 4 Array ptr = 0x7fff06c9f670 

Lorsque le processus enfant modifie un tableau, il doit également avoir modifié les données du processus parent. Que se passe-t-il en arrière-plan?

Lorsque vous fork un nouveau processus, le nouveau processus enfant est une copie du processus parent. C’est pourquoi les pointeurs, etc. sont égaux. En raison des merveilles de la mémoire virtuelle, deux processus peuvent avoir la même carte mémoire, mais utiliser quand même une mémoire différente.

fork crée une copie exacte de l’image mémoire du processus parent (voir exception dans la page de manuel). Ceci est appelé Copy On Write (COW). Jusqu’à ce que les enfants lisent seulement les données, le parent et l’enfant ont la même copie de données, mais lorsque l’enfant écrit, une nouvelle copie est générée, puis l’enfant et le parent ont des copies différentes pour leurs propres données.

fork() crée une copie du processus appelant, y compris toute la mémoire qui lui est allouée.

Chaque processus a son propre espace d’adressage et les valeurs des pointeurs sont dans le contexte de cet espace d’adressage. Ainsi, l’impression de l’adresse d’une variable dans le processus original donnera le même résultat que l’impression de cette adresse dans le processus engendré.

Cependant, en ce qui concerne le système d’exploitation, les adresses ne sont pas égales. Le système d’exploitation veille à ce que chaque processus ait l’illusion de sa propre mémoire.

Il existe des moyens de partager la mémoire entre les processus (c’est-à-dire ce qu’un processus écrit dans la mémoire partagée, l’autre voit). Cependant, ce n’est pas ce qui se produit par défaut et cela se produit toujours avec l’aide du système d’exploitation hôte.