Aggiunte su fork
[gapil.git] / prochand.tex
index e503452fe748a99b55de4b5f0d87c834bcc55039..b9cd6a7f653a70b2f819d52574d5e45983fcbb74 100644 (file)
@@ -192,17 +192,35 @@ della funzione 
 \end{functions}
 
 Dopo l'esecuzione di una \func{fork} sia il processo padre che il processo
-figlio continuano ad essere eseguiti normalmente, ed il processo figlio esegue
-esattamente lo stesso codice del padre. La sola differenza è che nel processo
-padre il valore di ritorno della funzione fork è il \acr{pid} del processo
-figlio, mentre nel figlio è zero; in questo modo il programma può identificare
-se viene eseguito dal padre o dal figlio.
+figlio continuano ad essere eseguiti normalmente alla istruzione seguente la
+\func{fork}; il processo figlio è però una copia del padre, e riceve una copia
+dei segmenti di testo, stack e dati (vedi \secref{sec:proc_mem_layout}), ed
+esegue esattamente lo stesso codice del padre, ma la memoria è copiata, non
+condivisa\footnote{In generale il segmento di testo, che è identico, è
+  condiviso e tenuto in read-only, linux poi utilizza la tecnica del
+  \textit{copy-on-write}, per cui la memoria degli altri segmenti viene
+  copiata dal kernel per il nuovo processo solo in caso di scrittura, rendendo
+  molto più efficiente il meccanismo} pertanto padre e figlio vedono variabili
+diverse.
+
+La differenza che si ha nei due processi è che nel processo padre il valore di
+ritorno della funzione fork è il \acr{pid} del processo figlio, mentre nel
+figlio è zero; in questo modo il programma può identificare se viene eseguito
+dal padre o dal figlio.
+
+Si noti come la funzione, caso unico che ne contraddistingue l'importanza,
+ritorni \textbf{due} volte. Nel caso del padre viene restituito il \acr{pid}
+del figlio in quanto potendo esservi più figli questo è il modo per poterne
+tracciare la creazione, il figlio invece ha un unico padre (il cui \acr{pid}
+può essere ottenuto con \func{getppid}, vista in \secref{sec:proc_pid}) e si
+usa il valore nullo (che non può essere il \acr{pid} di nessun processo)
 
 
 
 \subsection{Le funzioni \texttt{wait} e  \texttt{waitpid}}
 \label{sec:proc_wait}
 
+
 \subsection{Le funzioni \texttt{exec}}
 \label{sec:proc_exec}
 
@@ -267,8 +285,9 @@ lanciato il processo, e vengono settati al login al valore standard di
 Questi non vengono mai cambiati nella creazione di nuovi processi e restano
 sempre gli stessi per tutti i processi avviati in una sessione. In realtà è
 possibile modificarli (vedi \secref{sec:proc_setuid}), ma solo per un processo
-che abbia i privilegi di amministratore (ed è così infatti che \cmd{login} li
-setta ai valori corrispondenti all'utente che entra nel sistema).
+che abbia i privilegi di amministratore (ed è così infatti che \cmd{login},
+che gira con i privilegi di amministratore, li setta ai valori corrispondenti
+all'utente che entra nel sistema).
 
 L'\textit{effective user id}, l'\textit{effective group id} e gli eventuali
 \textit{supplementary group id} sono gli identificativi usati per il controllo