Hallo Ich habe ein Server-Programm erstellt, das einen neuen Prozess ausgibt, nachdem es eine Socket-Verbindung akzeptiert. Im Programm sind mehrere statisch zugewiesene globale Variablen definiert. Meine Frage ist, sind diese statischen Puffer zweimal nach der Verzweigung zugeordnet? Oder dupliziert die Gabel nur Adressraum auf dem Heap und dem Call-Stack?
Der gesamte Adressraum wird während fork(2)
"dupliziert". Es wird oft mit copy-on-write gemacht und es gibt weitere Details zum Teilen von Programmtext und den Bibliotheken, aber das ist hier nicht relevant. Sowohl die übergeordneten als auch die untergeordneten Prozesse haben ihre eigene Kopie der statischen Daten.
fork()
dupliziert das gesamte Prozessabbild. Alles davon. Als solche werden sie doppelt vergeben ... nein, sie werden einmal pro ausführbarem Bild zugewiesen, von dem es jetzt zwei gibt, und nein, wenn du dich auf eines im Elternteil beziehst, wird es nicht den gleichen Inhalt wie das des Kind, wenn Sie nicht gemeinsam genutzten Speicher verwenden.
Bei static
bedeutet dieses Schlüsselwort (ab ISO C99):
Ein Objekt, dessen Bezeichner deklariert ist mit externer oder interner Verknüpfung, oder mit dem Speicherklassenspezifizierer statisch hat statische Speicherdauer. Seine Lebensdauer ist die gesamte Ausführung des Programms und seines gespeicherten Wertes ist initialisiert nur einmal vor Programmstart.
Dies bedeutet grundsätzlich, dass Ihr Puffer einmal als Teil der CRT-Startroutine initialisiert wird und dieser Speicherplatz nur verschwindet, wenn Sie ihn beenden. In diesem Fall verschwindet dieser Speicher, wenn jedes Kind austritt.
Linux verwendet einen Mechanismus namens Copy-on-Write. Das bedeutet, dass, solange die Variable nicht geändert wird, der Eltern- und der Neue Prozess eine Variable teilen. Aber bevor die Variable geändert wird, wird sie kopiert und der neue Prozess verwendet die Kopie. Es ist aus Leistungsgründen getan und Technik wird faule Optimierung genannt. Sie sollten sich also keine Sorgen machen, dass die Änderung der Variablen in einem Prozess sie in einem anderen Prozess ändert.
Tags und Links c memory linux shared-memory fork