Ogni pagina allocata per il processo (sia essa una pagina di memoria virtuale che contiene lo stack o l'heap) viene copiata affinché il processo fork possa accedervi.
In realtà, non viene copiato all'inizio, è impostato su Copy-on-Write, il che significa che una volta che uno dei processi (genitore o figlio) tenta di modificare una pagina, viene copiato in modo che non si danneggino a vicenda, e avere ancora tutti i dati dal punto di fork() accessibili a loro.
Ad esempio, le code page, quelle su cui l'eseguibile effettivo è stato mappato in memoria, di solito sono di sola lettura e quindi vengono riutilizzate tra tutti i processi biforcuti - non verranno copiate di nuovo, poiché nessuno scrive lì, solo legge, e così il copy-on-write non sarà mai necessario.
Ulteriori informazioni sono disponibili qui e qui.
Dopo un fork il figlio è completamente indipendente dal genitore, ma può ereditare alcune cose che sono copie del genitore. Nel caso dell'heap, il figlio avrà concettualmente una copia dell'heap dei genitori al momento del fork. Tuttavia, le modifiche all'intestazione nello spazio degli indirizzi del bambino modificheranno solo la copia del bambino (ad es. tramite copia su scrittura).
Per quanto riguarda la documentazione:ho notato che la documentazione di solito afferma che tutto viene copiato, tranne per bla bla bla.
La risposta breve è "sporca durante la scrittura" - la risposta più lunga è .. molto più lunga.
Ma a tutti gli effetti - il modello di lavoro che a livello C è sicuro assumere è che subito dopo il fork() i due processi sono assolutamente identici -- cioè il bambino riceve una copia esatta al 100% -- (ma per un pochino bit intorno al valore di ritorno di fork()) - e poi iniziano a divergere man mano che ogni lato modifica la sua memoria, stack e heap.
Quindi la tua conclusione è leggermente sbagliata - il bambino inizia con gli stessi dati del genitore copiati nel proprio spazio - poi li modifica - e li vede come modificati - mentre il genitore continua con la propria copia.
In realtà le cose sono un po' più complesse - poiché cerca di evitare una copia completa facendo qualcosa di sporco; evitando di copiare finché non è necessario.
Dw.