Jemand klärt bitte auf, was mit Zeigern nach einem fork () passiert.
Wie ich es verstehe, sind Zeiger auf alles auf dem Stapel oder statisch zugewiesenen relativ zu den Stapel / Datensegmentregistern, so dass sie genau während einer Verzweigung kopiert werden, ist OK.
Was passiert jedoch, wenn ich vor dem Abzweigen etwas malloc () mache? zum Beispiel:
%Vor%Möglichkeiten, an die ich denke:
* p wird in einen anderen Teil des Heaps kopiert, p wird aktualisiert, um den neu kopierten Ort wiederzugeben.
p zeigt immer noch auf das Original. wenn ein Kind frei läuft (p); Der Eltern kann möglicherweise nicht darauf zugreifen.
p zeigt immer noch auf die ursprünglichen Daten, aber der untergeordnete Prozess hat keine Rechte, auf den Speicher zuzugreifen / diesen zu verwalten.
Welche davon ist, wenn überhaupt, richtig?
Beim Verzweigen wird der untergeordnete Prozess eine Kopie des übergeordneten Elements. Das schließt dynamisch zugewiesenen Speicher ein. Also wird der Speicher kopiert. Zeigeradresse bleibt gleich (Kopie ändert keine Daten, erinnern Sie sich?), Was durch virtuelle Adressierung erreicht wird. Vergessen Sie nicht, free
in den Eltern- und Kindprozessen aufzurufen.
Mallced-Speicher stammt aus dem Heap , was nur ein fantastisches Wort für eine Reihe von Speicherseiten ist. Da fork()
alle Speicherseiten eines Prozesses kopiert, unabhängig davon, ob sie in Lehrbüchern auffällig benannt wurden, funktionieren Zeiger, die von fork () zurückgegeben werden, problemlos in dem untergeordneten Element: -)