Werden globale Variablen nach dem Forking geteilt?

Lesezeit: 3 Minuten

Betrachten Sie diesen einfachen Code:

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

Wenn das Kind myvar erhöht, wird der Wert mit dem Vater geteilt (wie pthread)?

  • Ich stimme Tom zu. Sie hätten einfach den Wert beider Prozesse ausgeben und selbst sehen können, was die Ausgabe war. Denken Sie jedoch daran, in demjenigen zu schlafen, der keine Erhöhung von myvar erwartet, damit er nicht ausgeführt wird, bevor der andere Prozess ihn erhöhen würde (obwohl er dies nicht tun wird). Aber ja, lass es einfach laufen und sieh es dir an.

    – Loduwijk

    28. November 2010 um 20:16 Uhr

  • Beachten Sie den irreführenden Kommentar: Tatsächlich erhöht der übergeordnete Prozess den Zähler (es sei denn, der Fork ist fehlgeschlagen) und der untergeordnete Prozess tut nichts, außer sofort zu beenden.

    – Jonathan Leffler

    28. November 2010 um 23:52 Uhr

  • Erstens suchen Sie nicht nach Fehlern. Zweitens werden nur Dateideskriptoren gemeinsam genutzt.

    – tchrist

    28. November 2010 um 23:59 Uhr

Nein und Ja.

Nein, sie werden in keiner Weise geteilt, die für den Programmierer sichtbar ist; Die Prozesse können ihre eigenen Kopien der Variablen unabhängig voneinander ändern, und sie ändern sich ohne merkliche Auswirkungen auf die anderen Prozesse, die Eltern, Geschwister oder Nachkommen von fork() sind.

Aber ja, das Betriebssystem teilt die Seiten tatsächlich anfangs, weil Fork Copy-on-Write implementiert, was bedeutet, dass sie geteilt werden, sofern keiner der Prozesse die Seiten ändert. Dies ist jedoch eine Optimierung, die vernachlässigt werden kann.

Wenn Sie gemeinsam genutzte Variablen haben möchten, fügen Sie sie in eine anonyme gemeinsam genutzte Zuordnung ein (siehe mmap()). In diesem Fall werden sie wirklich gemeinsam genutzt, mit allen damit verbundenen Einschränkungen.

  • Bist du dir bei diesem Teil sicher? global variable can be shared among parent and child process ?

    – Ahmed Hamdy

    4. Mai 2014 um 21:09 Uhr

fork()ing erstellt eine exakte Kopie des übergeordneten Prozesses zum Zeitpunkt des Forkens. Allerdings nach dem fork() abgeschlossen ist, hat das Kind eine völlig andere Existenz und wird sich nicht bei den Eltern melden.

Mit anderen Worten, nein, die globalen Variablen des Elternteils werden nicht durch Änderungen im Kind verändert.

  • +1 Obwohl ich argumentieren würde, dass “völlig andere Existenz” irreführend sein kann, da einige Objekte, wie z. B. Dateihandles, unter verschiedenen Umständen geteilt werden können, IIRC.

    Benutzer166390

    28. November 2010 um 23:15 Uhr


  • Richtig, jeder Prozess hat als Folge der “exakten Kopie” sein eigenes Handle für alle gemeinsam genutzten Ressourcen (Dateien, Pipes usw.). Eigentlich nicht viel anders als zwei separate Prozesse, die dieselbe Datei öffnen.

    – Kevin Lakquement

    28. November 2010 um 23:34 Uhr

  • Es gibt einen entscheidenden Unterschied zwischen zwei Prozessen, die dieselbe Datei öffnen, und zwei Prozessen, die einen vor dem Forking erstellten Dateideskriptor gemeinsam nutzen: Die geforkten Prozesse teilen sich dieselbe offene Dateibeschreibung und denselben Offset; Wenn ein Prozess den Dateizeiger bewegt (durch Lesen oder Schreiben oder Suchen), wirkt sich dies auch auf den anderen aus. Bei separaten Öffnungen passiert dies nicht, da sie separate Beschreibungen geöffneter Dateien haben. Siehe: open(), fork(), lseek() usw.

    – Jonathan Leffler

    28. November 2010 um 23:49 Uhr

  • Danke, das wusste ich nicht. Oder, wenn ich es wusste, habe ich es vergessen. Es ist lange her, seit ich fork()ed habe.

    – Kevin Lakquement

    28. November 2010 um 23:57 Uhr

Benutzeravatar von Tharun
Tharun

Nach fork() wird der gesamte Prozess inklusive aller globalen Variablen dupliziert. Das untergeordnete Element ist eine exakte Kopie des übergeordneten Elements, außer dass es eine andere PID (Prozess-ID) und ein anderes übergeordnetes Element hat und fork() 0 zurückgibt. Globale Variablen sind innerhalb ihres eigenen Prozesses immer noch global. Die Antwort lautet also nein, globale Variablen werden nach einem Aufruf von fork() nicht zwischen Prozessen geteilt.

Nein, da globale Variablen nicht zwischen Prozessen geteilt werden, es sei denn, ein IPC-Mechanismus ist implementiert. Der Speicherplatz wird kopiert. Infolgedessen hat die globale Variable in beiden Prozessen unmittelbar nach der Verzweigung denselben Wert, aber wenn einer sie ändert, sieht der andere sie nicht geändert.

Threads hingegen teilen sich globale Variablen.

1409780cookie-checkWerden globale Variablen nach dem Forking geteilt?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy