From: Simone Piccardi Date: Mon, 3 Sep 2001 21:31:39 +0000 (+0000) Subject: Aggiunte su fork X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=8bd624da6e63ebf1174e62846f5800ad98373d4d;p=gapil.git Aggiunte su fork --- diff --git a/prochand.tex b/prochand.tex index 3ddfa4b..b9cd6a7 100644 --- a/prochand.tex +++ b/prochand.tex @@ -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}