web-dev-qa-db-fra.com

Après la fourche, les variables globales sont-elles partagées?

Considérez ce code simple:

 int myvar = 0;
 int main() {
     if (fork()>0) {
       myvar++;
     } else {
       // father do nothing
     }
 }

Lorsque l'enfant incrémente myvar, la valeur est-elle partagée avec le père (comme pthread)?

39
anon

Non et oui.

Non, ils ne sont partagés d'aucune manière visible par le programmeur; les processus peuvent modifier leurs propres copies des variables indépendamment et ils changeront sans aucun effet notable sur les autres processus qui sont des parents fork, des frères et sœurs ou des descendants.

Mais oui, le système d'exploitation partage réellement les pages au départ, car fork implémente la copie sur écriture, ce qui signifie qu'à condition qu'aucun des processus ne modifie les pages, elles sont partagées. Il s'agit cependant d'une optimisation qui peut être ignorée.

Si vous vouliez avoir des variables partagées, mettez-les dans un mappage partagé anonyme (voir mmap ()) auquel cas elles seront vraiment partagées, avec toutes les mises en garde qui vont avec.

48
MarkR

fork() ing crée une copie exacte du processus parent au moment du forking. Cependant, une fois la fork() terminée, l'enfant a une existence complètement différente et ne fera pas rapport au parent.

En d'autres termes, non, les variables globales du parent ne seront pas modifiées par les changements de l'enfant.

36
Kevin Lacquement

Après fork (), l'ensemble du processus, y compris toutes les variables globales, est dupliqué. L'enfant est une réplique exacte du parent, sauf qu'il a un PID (ID de processus) différent, un parent différent et fork () a renvoyé 0. Les variables globales sont toujours globales dans son propre processus. La réponse est donc non, les variables globales ne sont pas partagées entre les processus après un appel à fork ().

14
Tharun26

Non, car les variables globales ne sont pas partagées entre les processus sauf si un mécanisme IPC est implémenté. L'espace mémoire sera copié. Par conséquent, la variable globale des deux processus aura la même valeur immédiatement après fork, mais si l'un le change, l'autre ne le verra pas changé.

Les threads d'autre part partagent des variables globales.

3
Tom