Finito coi lupi mannari. Anzi no, erano zombie, ma tanto piu` o meno siamo
[gapil.git] / prochand.tex
1 \chapter{La gestione dei processi}
2 \label{cha:process_handling}
3
4 Come accennato nell'introduzione in un sistema unix ogni attività del sistema
5 viene svolta tramite i processi.  In sostanza i processi costituiscono l'unità
6 base per l'allocazione e l'uso delle risorse del sistema.
7
8 Nel precedente capitolo abbiamo visto come funziona un singolo processo, in
9 questo capitolo affronteremo i dettagli della creazione e della distruzione
10 dei processi, della gestione dei loro attributi e privilegi, e di tutte le
11 funzioni a questo connesse.
12
13
14 \section{Introduzione}
15 \label{sec:proc_gen}
16
17 Partiremo con una introduzione generale ai concetti che stanno alla base della
18 gestione dei processi in unix. Introdurremo in questa sezione l'architettura
19 della gestione dei processi e le sue principali caratteristiche, e daremo una
20 panoramica sull'uso delle principali funzioni per la gestione dei processi.
21
22 \subsection{La gerarchia dei processi}
23 \label{sec:proc_hierarchy}
24
25 A differenza di quanto avviene in altri sistemi (ad esempio nel VMS la
26 generazione di nuovi processi è un'operazione privilegiata) una delle
27 caratteristiche di unix (che esamineremo in dettaglio più avanti) è che
28 qualunque processo può a sua volta generarne altri, detti processi figli
29 (\textit{child process}). Ogni processo è identificato presso il sistema da un
30 numero unico, il \acr{pid} (da \textit{process identifier}).
31
32 Una seconda caratteristica è che la generazione di un processo è una
33 operazione separata rispetto al lancio di un programma. In genere la sequenza
34 è sempre quella di creare un nuovo processo, il quale si eseguirà, in un passo
35 successivo, il programma voluto: questo è ad esempio quello che fa la shell
36 quando mette in esecuzione il programma che gli indichiamo nella linea di
37 comando.
38
39 Una terza caratteristica è che ogni processo viene sempre generato da un altro
40 che viene chiamato processo genitore (\textit{parent process}). Questo vale
41 per tutti i processi, con una eccezione (dato che ci deve essere un punto di
42 partenza), esiste sempre infatti un processo speciale, che normalmente è
43 \cmd{/sbin/init}, che viene lanciato dal kernel quando questo ha finito la
44 fase di avvio, esso essendo il primo processo lanciato ha sempre il \acr{pid}
45 uguale a 1 e non è figlio di nessuno.
46
47 Questo è ovviamente un processo speciale, che in genere si occupa di far
48 partire tutti gli processi altri necessari al funzionamento del sistema,
49 inoltre \cmd{init} è essenziale per svolgere una serie di compiti
50 amministrativi nelle operazioni ordinarie del sistema (torneremo si alcuni di
51 essi in \secref{}) e non può mai essere terminato. La struttura del sistema
52 comunque consente di lanciare al posto di \cmd{init} qualunque altro programma
53 (e in casi di emergenza, ad esempio se il file di \cmd{init} si fosse
54 corrotto, è possibile farlo ad esempio passando la riga \cmd{init=/bin/sh}
55 all'avvio).
56
57 Dato che tutti i processi successivi sono comunque generati da \cmd{init} o da
58 suoi figli tutto ciò comporta che, i processi sono organizzati gerarchicamente
59 dalla relazione fra genitori e figli, in maniera analoga a come i file sono
60 organizzati in un albero di directory con alla base \file{/} (si veda
61 \secref{sec:file_file_struct}); in questo caso alla base dell'albero c'è il
62 processo \cmd{init} che è progenitore di ogni altro processo\footnote{in
63   realtà questo non è del tutto vero, in Linux ci sono alcuni processi che pur
64   comparendo come figli di init (ad esempio in \cmd{pstree}) sono generati
65   direttamente dal kernel, come \cmd{keventd}, \cmd{kswapd}, etc.}.
66
67
68 \subsection{Una panoramica sulle funzioni di gestione}
69 \label{sec:proc_handling_intro}
70
71 I processi vengono creati dalla funzione \func{fork}; in molti unix questa è
72 una system call, Linux però usa un'altra nomenclatura, e la funzione fork è
73 basata a sua volta sulla system call \func{\_\_clone}, che viene usata anche
74 per generare i \textit{thread}.  Il processo figlio creato dalla \func{fork} è
75 una copia identica del processo processo padre, ma ha nuovo \acr{pid} e viene
76 eseguito in maniera indipendente (le differenze fra padre e figlio sono
77 affrontate in dettaglio in \secref{sec:proc_fork}).
78
79 Se si vuole che il processo padre si fermi fino alla conclusione del processo
80 figlio questo deve essere specificato subito dopo la \func{fork} chiamando la
81 funzione \func{wait} o la funzione \func{waitpid} (si veda
82 \secref{sec:proc_wait}); queste funzioni restituiscono anche una informazione
83 abbastanza limitata (lo stato di terminazione) sulle cause della terminazione
84 del processo.
85
86 Quando un processo ha concluso il suo compito o ha incontrato un errore non
87 risolvibile esso può essere terminato con la funzione \func{exit} (si veda
88 quanto discusso in \secref{sec:proc_termination}). La vita del processo però
89 termina solo quando la notifica della sua conclusione viene ricevuta dal
90 processo padre, a quel punto tutte le risorse allocate nel sistema ad esso
91 associate vengono rilasciate.
92
93 Avere due processi che eseguono esattamente lo stesso codice non è molto
94 utile, normalmente si genera un secondo processo per affidargli l'esecuzione
95 di un compito specifico (ad esempio gestire una connessione dopo che questa è
96 stata stabilita), o fargli eseguire (come fa la shell) un altro programma. Per
97 quest'ultimo caso si usa la seconda funzione fondamentale per programmazione
98 coi processi che è la \func{exec}.
99
100 Il programma che un processo sta eseguendo si chiama immagine del processo (o
101 \textit{process image}), le funzioni della famiglia \func{exec} permettono di
102 caricare un'altro programma da disco sostituendo quest'ultimo all'immagine
103 corrente; questo fa si che l'immagine precedente venga completamente
104 cancellata. Questo significa che quando il nuovo programma esce anche il
105 processo termina, e non si può tornare alla precedente immagine.
106
107 Per questo motivo la \func{fork} e la \func{exec} sono funzioni molto
108 particolari con caratteristiche uniche rispetto a tutte le altre, infatti la
109 prima ritorna due volte (nel processo padre e nel figlio) mentre la seconda
110 non ritorna mai (in quanto con essa viene eseguito un altro programma).
111
112
113
114 \section{La gestione dei processi}
115 \label{sec:proc_handling}
116
117 In questa sezione tratteremo le funzioni per la gestione dei processi, a
118 partire dalle funzioni elementari che permettono di leggerne gli
119 identificatori, alle varie funzioni di manipolazione dei processi, che
120 riguardano la loro creazione, terminazione, e la messa in esecuzione di altri
121 programmi.
122
123
124 \subsection{Gli identificatori dei processi}
125 \label{sec:proc_pid}
126
127 Come accennato nell'introduzione ogni processo viene identificato dal sistema
128 da un numero identificativo unico, il \textit{process id} o \acr{pid};
129 quest'ultimo è un tipo di dato standard, il \type{pid\_t} che in genere è un
130 intero con segno (nel caso di Linux e delle glibc il tipo usato è \type{int}).
131
132 Il \acr{pid} viene assegnato in forma progressiva ogni volta che un nuovo
133 processo viene creato, fino ad un limite massimo (in genere essendo detto
134 numero memorizzato in un intero a 16 bit si arriva a 32767) oltre il quale si
135 riparte dal numero più basso disponibile (FIXME: verificare, non sono sicuro).
136 Per questo motivo processo il processo di avvio (\cmd{init}) ha sempre il
137 \acr{pid} uguale a uno. 
138
139 Tutti i processi inoltre memorizzano anche il \acr{pid} del genitore da cui
140 sono stati creati, questo viene chiamato in genere \acr{ppid} (da
141 \textit{parent process id}) ed è normalmente utilizzato per il controllo di
142 sessione.  Questi due identificativi possono essere ottenuti da programma
143 usando le funzioni:
144 \begin{functions}
145 \headdecl{sys/types.h}
146 \headdecl{unistd.h}
147 \funcdecl{pid\_t getpid(void)} restituisce il pid del processo corrente.
148 \funcdecl{pid\_t getppid(void)} restituisce il pid del padre del processo
149     corrente.
150 Entrambe le funzioni non riportano condizioni di errore. 
151 \end{functions}
152 esempi dell'uso di queste funzioni sono riportati in
153 \figref{fig:proc_fork_code}, nel programma di esempio \file{ForkTest.c}.
154
155 Il fatto che il \acr{pid} sia un numero univoco per il sistema lo rende il
156 candidato ideale per generare ulteriori indicatori associati al processo di
157 cui diventa possibile garantire l'unicità: ad esempio la funzione
158 \func{tmpname} (si veda \secref{sec:file_temp_file}) usa il \acr{pid} per
159 generare un pathname univoco, che non potrà essere replicato da un'altro
160 processo che usi la stessa funzione. 
161
162 Tutti i processi figli dello stesso processo padre sono detti
163 \textit{sibling}, questa è un'altra delle relazioni usate nel controllo di
164 sessione, in cui si raggruppano tutti i processi creati su uno stesso
165 terminale una volta che si è effettuato il login. Torneremo su questo
166 argomento in \secref{cap:terminal}, dove esamineremo tutti gli altri
167 identificativi associati ad un processo relativi al controllo di sessione.
168
169
170 \subsection{La funzione \func{fork}}
171 \label{sec:proc_fork}
172
173 La funzione \func{fork} è la funzione fondamentale della gestione dei
174 processi: come si è detto l'unico modo di creare un nuovo processo è
175 attraverso l'uso di questa funzione, essa quindi riveste un ruolo centrale
176 tutte le volte che si devono scrivere programmi che usano il multitasking.  Il
177 prototipo della funzione è:
178
179 \begin{functions}
180   \headdecl{sys/types.h} 
181   \headdecl{unistd.h} 
182   \funcdecl{pid\_t fork(void)} 
183   Restituisce zero al padre e il \acr{pid} al figlio in caso di successo,
184   ritorna -1 al padre (senza creare il figlio) in caso di errore;
185   \texttt{errno} può assumere i valori:
186   \begin{errlist}
187   \item \macro{EAGAIN} non ci sono risorse sufficienti per creare un'altro
188     processo (per allocare la tabella delle pagine e le strutture del task) o
189     si è esaurito il numero di processi disponibili.
190   \item \macro{ENOMEM} non è stato possibile allocare la memoria per le
191     strutture necessarie al kernel per creare il nuovo processo.
192   \end{errlist}
193 \end{functions}
194
195 Dopo il successo dell'esecuzione di una \func{fork} sia il processo padre che
196 il processo figlio continuano ad essere eseguiti normalmente alla istruzione
197 seguente la \func{fork}; il processo figlio è però una copia del padre, e
198 riceve una copia dei segmenti di testo, stack e dati (vedi
199 \secref{sec:proc_mem_layout}), ed esegue esattamente lo stesso codice del
200 padre, ma la memoria è copiata, non condivisa\footnote{In generale il segmento
201   di testo, che è identico, è condiviso e tenuto in read-only, Linux poi
202   utilizza la tecnica del \textit{copy-on-write}, per cui la memoria degli
203   altri segmenti viene copiata dal kernel per il nuovo processo solo in caso
204   di scrittura, rendendo molto più efficiente il meccanismo} pertanto padre e
205 figlio vedono variabili diverse.
206
207 La differenza che si ha nei due processi è che nel processo padre il valore di
208 ritorno della funzione fork è il \acr{pid} del processo figlio, mentre nel
209 figlio è zero; in questo modo il programma può identificare se viene eseguito
210 dal padre o dal figlio.
211 Si noti come la funzione \func{fork} ritorni \textbf{due} volte: una nel padre
212 e una nel figlio. La sola differenza che si ha nei due processi è il valore di
213 ritorno restituito dalla funzione, che nel padre è il \acr{pid} del figlio
214 mentre nel figlio è zero; in questo modo il programma può identificare se
215 viene eseguito dal padre o dal figlio. 
216
217 La scelta di questi valori non è casuale, un processo infatti può avere più
218 figli, ed il valore di ritorno di \func{fork} è l'unico modo che permette di
219 identificare quello appena creato; al contrario un figlio ha sempre un solo
220 padre (il cui \acr{pid} può sempre essere ottenuto con \func{getppid}, vedi
221 \secref{sec:proc_pid}) e si usa il valore nullo, che non può essere il
222 \acr{pid} di nessun processo.
223
224 \begin{figure}[!htb]
225   \footnotesize
226   \begin{lstlisting}{}
227 #include <errno.h>       /* error definitions and routines */ 
228 #include <stdlib.h>      /* C standard library */
229 #include <unistd.h>      /* unix standard library */
230 #include <stdio.h>       /* standard I/O library */
231 #include <string.h>      /* string functions */
232
233 /* Help printing routine */
234 void usage(void);
235
236 int main(int argc, char *argv[])
237 {
238 /* 
239  * Variables definition  
240  */
241     int nchild, i;
242     pid_t pid;
243     int wait_child  = 0;
244     int wait_parent = 0;
245     int wait_end    = 0;
246     ...        /* handling options */
247     nchild = atoi(argv[optind]);
248     printf("Test for forking %d child\n", nchild);
249     /* loop to fork children */
250     for (i=0; i<nchild; i++) {
251         if ( (pid = fork()) < 0) { 
252             /* on error exit */ 
253             printf("Error on %d child creation, %s\n", i+1, strerror(errno));
254             exit(-1); 
255         }
256         if (pid == 0) {   /* child */
257             printf("Child %d successfully executing\n", ++i);
258             if (wait_child) sleep(wait_child);
259             printf("Child %d, parent %d, exiting\n", i, getppid());
260             exit(0);
261         } else {          /* parent */
262             printf("Spawned %d child, pid %d \n", i+1, pid);
263             if (wait_parent) sleep(wait_parent);
264             printf("Go to next child \n");
265         }
266     }
267     /* normal exit */
268     if (wait_end) sleep(wait_end);
269     return 0;
270 }
271   \end{lstlisting}
272   \caption{Esempio di codice per la creazione di nuovi processi.}
273   \label{fig:proc_fork_code}
274 \end{figure}
275
276 Normalmente la chiamata a \func{fork} può fallire solo per due ragioni, o ci
277 sono già troppi processi nel sistema (il che di solito è sintomo che
278 qualcos'altro non sta andando per il verso giusto) o si è ecceduto il limite
279 sul numero totale di processi permessi all'utente (il valore della costante
280 \macro{CHILD\_MAX} definito in \file{limits.h}, che fa riferimento ai processo
281 con lo stesso \textit{real user id}).
282
283 L'uso di \func{fork} avviene secondo due modalità principali; la prima è
284 quella in cui all'interno di un programma si creano processi figli per
285 affidargli l'esecuzione di una certa sezione di codice, mentre il processo
286 padre ne esegue un'altra. È il caso tipico dei server di rete in cui il padre
287 riceve ed accetta le richieste da parte dei client, per ciascuna delle quali
288 pone in esecuzione un figlio che è incaricato di fornire il servizio.
289
290 La seconda modalità è quella in cui il processo vuole eseguire un altro
291 programma; questo è ad esempio il caso della shell. In questo caso il processo
292 crea un figlio la cui unica operazione è quella fare una \func{exec} (di cui
293 parleremo in \secref{sec:proc_exec}) subito dopo la \func{fork}.
294
295 Alcuni sistemi operativi (il VMS ad esempio) combinano le operazioni di questa
296 seconda modalità (una \func{fork} seguita da una \func{exec}) in un'unica
297 operazione che viene chiamata \textit{spawn}. Nei sistemi unix-like è stato
298 scelto di mantenere questa separazione, dato che, come visto per la prima
299 modalità d'uso, esistono numerosi scenari in cui si può usare una \func{fork}
300 senza bisogno di una \func{exec}. Inoltre anche nel caso della seconda
301 modalità di operazioni, avere le due funzioni separate permette al figlio di
302 cambiare gli attributi del processo (maschera dei segnali, redirezione
303 dell'output, \textit{user id}) prima della \func{exec}, rendendo molto più
304 flessibile la possibilità di modificare gli attributi del nuovo processo.
305
306 In \curfig\ si è riportato il corpo del codice del programma di esempio
307 \cmd{forktest}, che ci permette di illustrare molte caratteristiche dell'uso
308 della funzione \func{fork}. Il programma permette di creare un numero di figli
309 specificato a linea di comando, e prende anche alcune opzioni per indicare
310 degli eventuali tempi di attesa in secondi (eseguiti tramite la funzione
311 \func{sleep}) per il padre ed il figlio (con \cmd{forktest -h} si ottiene la
312 descrizione delle opzioni); il codice completo, compresa la parte che gestisce
313 le opzioni a riga di comando, è disponibile nel file \file{ForkTest.c}.
314
315 Decifrato il numero di figli da creare, il ciclo principale del programma
316 (\texttt{\small 28--40}) esegue in successione la creazione dei processi figli
317 controllando il successo della chiamata a \func{fork} (\texttt{\small
318   29--31}); ciascun figlio (\texttt{\small 29--31}) si limita a stampare il
319 suo numero di successione, eventualmente attendere il numero di secondi
320 specificato e scrivere un messaggio prima di uscire. Il processo padre invece
321 (\texttt{\small 29--31}) stampa un messaggio di creazione, eventualmente
322 attende il numero di secondi specificato, e procede nell'esecuzione del ciclo;
323 alla conclusione del ciclo, prima di uscire, può essere specificato un altro
324 periodo di attesa.
325
326 Se eseguiamo il comando senza specificare attese (come si può notare in
327 \texttt{\small 17--19} i valori di default specificano di non attendere),
328 otterremo come output sul terminale:
329 \begin{verbatim}
330 [piccardi@selidor sources]$ ./forktest 3
331 Test for forking 3 child
332 Spawned 1 child, pid 1964 
333 Child 1 successfully executing
334 Child 1, parent 1963, exiting
335 Go to next child 
336 Spawned 2 child, pid 1965 
337 Child 2 successfully executing
338 Child 2, parent 1963, exiting
339 Go to next child 
340 Child 3 successfully executing
341 Child 3, parent 1963, exiting
342 Spawned 3 child, pid 1966 
343 Go to next child 
344 \end{verbatim} %$
345
346 Esaminiamo questo risultato: una prima conclusione che si può trarre è non si
347 può dire quale processo fra il padre ed il figlio venga eseguito per
348 primo\footnote{anche se nel kernel 2.4.x era stato introdotto un meccanismo
349   che metteva in esecuzione sempre il xxx per primo (TODO recuperare le
350   informazioni esatte)} dopo la chiamata a \func{fork}; dall'esempio si può
351 notare infatti come nei primi due cicli sia stato eseguito per primo il padre
352 (con la stampa del \acr{pid} del nuovo processo) per poi passare
353 all'esecuzione del figlio (completata con i due avvisi di esecuzione ed
354 uscita), e tornare all'esecuzione del padre (con la stampa del passaggio al
355 ciclo successivo), mentre la terza volta è stato prima eseguito il figlio
356 (fino alla conclusione) e poi il padre.
357
358 In generale l'ordine di esecuzione dipenderà, oltre che dall'algoritmo di
359 scheduling usato dal kernel, dalla particolare situazione in si trova la
360 macchina al momento della chiamata, risultando del tutto impredicibile.
361 Eseguendo più volte il programma di prova e producendo un numero diverso di
362 figli, si sono ottenute situazioni completamente diverse, compreso il caso in
363 cui il processo padre ha eseguito più di una \func{fork} prima che uno dei
364 figli venisse messo in esecuzione.
365
366 Pertanto non si può fare nessuna assunzione sulla sequenza di esecuzione delle
367 istruzioni del codice fra padre e figli, nè sull'ordine in cui questi potranno
368 essere messi in esecuzione, e se è necessaria una qualche forma di precedenza
369 occorrerà provvedere ad espliciti meccanismi di sincronizzazione, pena il
370 rischio di incorrere nelle cosiddette \textit{race conditions}.
371
372 Si noti inoltre che, come accennato, essendo i segmenti di memoria utilizzati
373 dai singoli processi completamente separati, le modifiche delle variabili nei
374 processi figli (come l'incremento di \var{i} in \texttt{\small 33}) sono
375 visibili solo al loro interno, e non hanno alcun effetto sul valore che le
376 stesse variabili hanno nel processo padre (ed in eventuali altri processi
377 figli che eseguano lo stesso codice).
378
379 Un secondo aspetto molto importante nella creazione dei processi figli è
380 quello dell'interazione dei vari processi con i file; per illustrarlo meglio
381 proviamo a redirigere su un file l'output del nostro programma di test, quello
382 che otterremo è:
383 \begin{verbatim}
384 [piccardi@selidor sources]$ ./forktest 3 > output
385 [piccardi@selidor sources]$ cat output
386 Test for forking 3 child
387 Child 1 successfully executing
388 Child 1, parent 1967, exiting
389 Test for forking 3 child
390 Spawned 1 child, pid 1968 
391 Go to next child 
392 Child 2 successfully executing
393 Child 2, parent 1967, exiting
394 Test for forking 3 child
395 Spawned 1 child, pid 1968 
396 Go to next child 
397 Spawned 2 child, pid 1969 
398 Go to next child 
399 Child 3 successfully executing
400 Child 3, parent 1967, exiting
401 Test for forking 3 child
402 Spawned 1 child, pid 1968 
403 Go to next child 
404 Spawned 2 child, pid 1969 
405 Go to next child 
406 Spawned 3 child, pid 1970 
407 Go to next child 
408 \end{verbatim}
409 che come si vede è completamente diverso da quanto ottenevamo sul terminale.
410
411 Il comportamento delle varie funzioni di interfaccia con i file è analizzato
412 in gran dettaglio in \capref{cha:file_unix_interface} e in
413 \secref{cha:files_std_interface}. Qui basta accennare che si sono usate le
414 funzioni standard della libreria del C che prevedono l'output bufferizzato; e
415 questa bufferizzazione varia a seconda che si tratti di un file su disco (in
416 cui il buffer viene scaricato su disco solo quando necessario) o di un
417 terminale (nel qual caso il buffer viene scaricato ad ogni a capo).
418
419 Nel primo esempio allora avevamo che ad ogni chiamata a \func{printf} il
420 buffer veniva scaricato, e le singole righe erano stampate a video subito dopo
421 l'esecuzione della \func{printf}. Ma con la redirezione su file la scrittura
422 non avviene più alla fine di ogni riga e l'output resta nel buffer, per questo
423 motivo, dato che ogni figlio riceve una copia della memoria del padre, esso
424 riceverà anche quanto c'è nel buffer delle funzioni di I/O, comprese le linee
425 scritte dal padre fino allora. Così quando all'uscita del figlio il buffer
426 viene scritto su disco, troveremo nel file anche tutto quello che il processo
427 padre aveva scritto prima della sua creazione.  E alla fine del file, dato che
428 in questo caso il padre esce per ultimo, troviamo anche l'output del padre.
429
430 Ma l'esempio ci mostra un'altro aspetto fondamentale dell'interazione con i
431 file, che era valido anche per l'esempio precedente, ma meno evidente; il
432 fatto cioè che non solo processi diversi possono scrivere in contemporanea
433 sullo stesso file (l'argomento della condivisione dei file in unix è trattato
434 in dettaglio in \secref{sec:file_sharing}), ma anche che, a differenza di
435 quanto avviene per le variabili, la posizione corrente sul file è condivisa 
436 fra il padre e tutti i processi figli. 
437
438 Quello che succede è che quando lo standard output del padre viene rediretto,
439 lo stesso avviene anche per tutti i figli; la funzione \func{fork} infatti ha
440 la caratteristica di duplicare (allo stesso modo in cui lo fa la funzione
441 \func{dup}, trattata in \secref{sec:file_dup}) nei figli tutti i file
442 descriptor aperti nel padre, il che comporta che padre e figli condividono
443 le stesse voci della file table (per la spiegazione di questi termini si veda
444 \secref{sec:file_sharing} e referenza a figura da fare) e quindi anche
445 l'offset corrente nel file.
446
447 In questo modo se un processo scrive sul file aggiornerà l'offset sulla file
448 table, e tutti gli altri processi che condividono la file table vedranno il
449 nuovo valore; in questo modo si evita, in casi come quello appena mostrato in
450 cui diversi processi scrivono sullo stesso file, che l'output successivo di un
451 processo vada a sovrapporsi a quello dei precedenti (l'output potrà risultare
452 mescolato, ma non ci saranno parti perdute per via di una sovrascrittura).
453
454 Questo tipo di comportamento è essenziale in tutti quei casi in cui il padre
455 crea un figlio ed attende la sua conclusione per proseguire, ed entrambi
456 scrivono sullo stesso file, ad esempio lo standard output (un caso tipico è la
457 shell). Se l'output viene rediretto con questo comportamento avremo che il
458 padre potrà continuare a scrivere automaticamente in coda a quanto scritto dal
459 figlio; se così non fosse ottenere questo comportamento sarebbe estremamente
460 complesso necessitando di una qualche forma di comunicazione fra i due
461 processi.
462
463 In generale comunque non è buona norma far scrivere più processi sullo stesso
464 file senza una qualche forma di sincronizzazione in quanto, come visto con il
465 nostro esempio, le varie scritture risulteranno mescolate fra loro in una
466 sequenza impredicibile. Le modalità con cui in genere si usano i file dopo una
467 \func{fork} sono sostanzialmente due:
468 \begin{enumerate}
469 \item Il processo padre aspetta la conclusione del figlio. In questo caso non
470   è necessaria nessuna azione riguardo ai file, in quanto la sincronizzazione
471   degli offset dopo eventuali operazioni di lettura e scrittura effettuate dal
472   figlio è automatica.
473 \item L'esecuzione di padre e figlio procede indipendentemente. In questo caso
474   ciascuno dei due deve chiudere i file che non gli servono una volta che la
475   \func{fork} è stata eseguita, per evitare ogni forma di interferenza.
476 \end{enumerate}
477
478 Oltre ai file aperti i processi figli ereditano dal padre una serie di altre
479 proprietà comuni; in dettaglio avremo che dopo l'esecuzione di una \func{fork}
480 padre e figlio avranno in comune:
481 \begin{itemize}
482 \item i file aperti (e gli eventuali flag di \textit{close-on-exec} se
483   settati).
484 \item gli identificatori per il controllo di accesso: il \textit{real user
485     id}, il \textit{real group id}, l'\textit{effective user id},
486   l'\textit{effective group id} e i \textit{supplementary group id} (vedi
487   \secref{tab:proc_uid_gid}).
488 \item gli identificatori per il controllo di sessione: il \textit{process
489     group id} e il \textit{session id} e il terminale di controllo.
490 \item i flag \acr{suid} e \acr{suid} (vedi \secref{sec:file_suid_sgid}).
491 \item la directory di lavoro e la directory radice (vedi
492   \secref{sec:file_work_dir}).
493 \item la maschera dei permessi di creazione (vedi \secref{sec:file_umask}).
494 \item la maschera dei segnali.
495 \item i segmenti di memoria condivisa agganciati al processo. 
496 \item i limiti sulle risorse
497 \item le variabili di ambiente (vedi \secref{sec:proc_environ}).
498 \end{itemize}
499 le differenze invece sono:
500 \begin{itemize}
501 \item il valore di ritorno di \func{fork}.
502 \item il \textit{process id}. 
503 \item il \textit{parent process id} (quello del figlio viene settato al
504   \acr{pid} del padre).
505 \item i valori dei tempi di esecuzione (\var{tms\_utime}, \var{tms\_stime},
506   \var{tms\_cutime}, \var{tms\_uetime}) che nel figlio sono posti a zero.
507 \item i \textit{file lock}, che non vengono ereditati dal figlio.
508 \item gli allarmi pendenti, che per il figlio vengono cancellati.
509 \end{itemize}
510
511
512 \subsection{La funzione \func{vfork}}
513 \label{sec:proc_vfork}
514
515 La funzione \func{vfork} è esattamente identica a \func{fork} ed ha la stessa
516 semantica e gli stessi errori; la sola differenza è che non viene creata la
517 tabella delle pagine né la struttura dei task per il nuovo processo. Il
518 processo padre è posto in attesa fintanto che il figlio non ha eseguito una
519 \func{execve} o non è uscito con una \func{\_exit}. Il figlio condivide la
520 memoria del padre (e modifiche possono avere effetti imprevedibili) e non deve
521 ritornare o uscire con \func{exit} ma usare esplicitamente \func{\_exit}.
522
523 Questa funzione è un rimasuglio dei vecchi tempi in cui eseguire una
524 \func{fork} comportava anche la copia completa del segmento dati del processo
525 padre, che costituiva un inutile appesantimento in tutti quei casi in cui la
526 \func{fork} veniva fatto solo per poi eseguire una \func{exec}. La funzione
527 venne introdotta in BSD per migliorare le prestazioni.
528
529 Dato che Linux supporta il \textit{copy on write} la perdita di prestazioni è
530 assolutamente trascurabile, e l'uso di questa funzione (che resta un caso
531 speciale della funzione \func{clone}), è deprecato, per questo eviteremo di
532 trattarla ulteriormente.
533
534
535 \subsection{La conclusione di un processo.}
536 \label{sec:proc_termination}
537
538 In \secref{sec:proc_conclusion} abbiamo già affrontato le modalità con cui
539 concludere un programma, ma dal punto di vista del programma stesso; avendo a
540 che fare con un sistema multitasking occorre adesso affrontare l'argomento dal
541 punto di vista generale di come il sistema gestisce la conclusione dei
542 processi.
543
544 Abbiamo già visto in \secref{sec:proc_conclusion} le tre modalità con cui un
545 programma viene terminato in maniera normale: la chiamata di \func{exit} (che
546 esegue le funzioni registrate per l'uscita e chiude gli stream), il ritorno
547 dalla funzione \func{main} (equivalente alla chiamata di \func{exit}), e la
548 chiamata ad \func{\_exit} (che passa direttamente alle operazioni di
549 terminazione del processo da parte del kernel).
550
551 Ma oltre alla conclusione normale abbiamo accennato che esistono anche delle
552 modalità di conclusione anomala; queste sono in sostanza due: il programma può
553 chiamare la funzione \func{abort} per invocare una chiusura anomala, o essere
554 terminato da un segnale.  In realtà anche la prima modalità si riconduce alla
555 seconda, dato che \func{abort} si limita a generare il segnale
556 \macro{SIGABRT}.
557
558 Qualunque sia la modalità di conclusione di un processo, il kernel esegue
559 comunque una serie di operazioni: chiude tutti i file aperti, rilascia la
560 memoria che stava usando, e così via; l'elenco completo delle operazioni
561 eseguite alla chiusura di un processo è il seguente:
562 \begin{itemize}
563 \item tutti i descrittori dei file sono chiusi.
564 \item viene memorizzato lo stato di terminazione del processo.
565 \item ad ogni processo figlio viene assegnato un nuovo padre.
566 \item viene inviato il segnale \macro{SIGCHLD} al processo padre.
567 \item se il processo è un leader di sessione viene mandato un segnale di
568   \macro{SIGHUP} a tutti i processi in background e il terminale di controllo
569   viene disconnesso.
570 \item se la conclusione di un processe rende orfano un \textit{process group}
571   ciascun membro del gruppo viene bloccato, e poi gli vengono inviati in
572   successione i segnali \macro{SIGHUP} e \macro{SIGCONT}.
573 \end{itemize}
574 ma al di la di queste operazioni è necessario poter disporre di un meccanismo
575 ulteriore che consenta di sapere come questa terminazione è avvenuta; dato che
576 in un sistema unix-like tutto viene gestito attraverso i processi il
577 meccanismo scelto consiste nel riportare lo stato di terminazione
578 (\textit{termination status}) di cui sopra al processo padre.
579
580 Nel caso di conclusione normale, lo stato di uscita del processo viene
581 caratterizzato tremite il valore del cosiddetto \textit{exit status}, cioè il
582 valore passato alle funzioni \func{exit} o \func{\_exit} (o dal valore di
583 ritorno per \func{main}).  Ma se il processo viene concluso in maniera anomala
584 il programma non può specificare nessun \textit{exit status}, ed è il kernel
585 che deve generare autonomamente il \textit{termination status} per indicare le
586 ragioni della conclusione anomala.  
587
588 Si noti la distinzione fra \textit{exit status} e \textit{termination status}:
589 quello che contraddistingue lo stato di chiusura del processo e viene
590 riportato attraverso le funzioni \func{wait} o \func{waitpid} (vedi
591 \secref{sec:proc_wait}) è sempre quest'ultimo; in caso di conclusione normale
592 il kernel usa il primo (nel codice eseguito da \func{\_exit}) per produrre il
593 secondo.
594
595 La scelta di riportare al padre lo stato di terminazione dei figli, pur
596 essendo l'unica possibile, comporta comunque alcune complicazioni: infatti se
597 alla sua creazione è scontato che ogni nuovo processo ha un padre, non è detto
598 che sia così alla sua conclusione, dato che il padre protrebbe essere già
599 terminato (si potrebbe avere cioè quello che si chiama un processo
600 \textsl{orfano}). 
601
602 Questa complicazione viene superata facendo in modo che il processo figlio
603 venga \textsl{adottato} da \cmd{init}: come già accennato quando un processo
604 termina il kernel controlla se è il padre di altri processi in esecuzione: in
605 caso positivo allora il \acr{ppid} di tutti questi processi viene sostituito
606 con il \acr{pid} di \cmd{init} (e cioè con 1); in questo modo ogni processo
607 avrà sempre un padre (nel caso \textsl{adottivo}) cui riportare il suo stato
608 di terminazione.  Come verifica di questo comportamento eseguiamo il comando
609 \cmd{forktest -c2 3}, in questo modo ciascun figlio attenderà due secondi
610 prima di uscire, il risultato è:
611 \begin{verbatim}
612 [piccardi@selidor sources]$ ./forktest -c2 3
613 Test for forking 3 child
614 Spawned 1 child, pid 1973 
615 Child 1 successfully executing
616 Go to next child 
617 Spawned 2 child, pid 1974 
618 Child 2 successfully executing
619 Go to next child 
620 Child 3 successfully executing
621 Spawned 3 child, pid 1975 
622 Go to next child 
623 [piccardi@selidor sources]$ Child 3, parent 1, exiting
624 Child 2, parent 1, exiting
625 Child 1, parent 1, exiting
626 \end{verbatim}
627 come si può notare in questo caso il processo padre si conclude prima dei
628 figli, tornando alla shell, che stampa il prompt sul terminale: circa due
629 secondi dopo viene stampato a video anche l'output dei tre figli che
630 terminano, e come si può notare in questo caso, al contrario di quanto visto
631 in precedenza, essi riportano 1 come \acr{ppid}.
632
633 Altrettanto rilevante è il caso in cui il figlio termina prima del padre,
634 questo perché non è detto che il padre possa ricevere immediatamente lo stato
635 di terminazione, quindi il kernel deve comunque conservare una certa quantità
636 di informazioni riguardo ai processi che sta terminando.
637
638 Questo viene fatto mantenendo attiva la voce nella tabella dei processi, e
639 memorizzando alcuni dati essenziali, come il \acr{pid}, i tempi di CPU usati
640 dal processo (vedi \secref{sec:intro_unix_time}) e lo stato di terminazione
641 (NdA verificare esattamente cosa c'è!), mentre la memoria in uso ed i file
642 aperti vengono rilasciati immediatamente. I processi che sono terminati, ma il
643 cui stato di terminazione non è stato ancora ricevuto dal padre sono chiamati
644 \textit{zombie}, essi restano presenti nella tabella dei processi ed in genere
645 possono essere identificati dall'output di \cmd{ps} per la presenza di una
646 \cmd{Z} nella colonna che ne indica lo stato. Quando il padre effettuarà la
647 lettura dello stato di uscita anche questa informazione, non più necessaria,
648 verrà scartata e la terminazione potrà dirsi completamente conclusa.
649
650 Possiamo utilizzare il nostro programma di prova per analizzare anche questa
651 condizione: lanciamo il comando \cmd{forktest -e10 3 &} in background,
652 indicando al processo padre di aspettare 10 secondi prima di uscire; in questo
653 caso, usando \cmd{ps} sullo stesso terminale (prima dello scadere dei 10
654 secondi) otterremo:
655 \begin{verbatim}
656 [piccardi@selidor sources]$ ps T
657   PID TTY      STAT   TIME COMMAND
658   419 pts/0    S      0:00 bash
659   568 pts/0    S      0:00 ./forktest -e10 3
660   569 pts/0    Z      0:00 [forktest <defunct>]
661   570 pts/0    Z      0:00 [forktest <defunct>]
662   571 pts/0    Z      0:00 [forktest <defunct>]
663   572 pts/0    R      0:00 ps T
664 \end{verbatim} %$
665 e come si vede, dato che non si è fatto nulla per riceverne lo stato di
666 terminazione, i tre processi figli sono ancora presenti pur essendosi
667 conclusi, con lo stato di zombie e l'indicazione che sono stati terminati.
668
669 La possibilità di avere degli zombie deve essere tenuta sempre presente quando
670 si scrive un programma che deve essere mantenuto in esecuzione a lungo e
671 creare molti figli. In questo caso si deve sempre avere cura di far leggere
672 l'eventuale stato di uscita di tutti i figli (in genere questo si fa
673 attraverso un apposito \textit{signal handler}, che chiama la funzione
674 \func{wait}, vedi \secref{sec:sig_xxx} e \secref{sec:proc_wait}). Questa
675 operazione è necessaria perché anche se gli \textit{zombie} non consumano
676 risorse di memoria o processore, occupano comunque una voce nella tabella dei
677 processi, che a lungo andare potrebbe esaurirsi.
678
679 Si noti che quando un processo adottato da \cmd{init} termina, esso non
680 diviene uno \textit{zombie}; questo perché una delle funzioni di \cmd{init} è
681 appunto quella di chiamare la funzione \func{wait} per i processi cui fa da
682 padre, completandone la terminazione. Questo è quanto avviene anche quando,
683 come nel caso del precedente esempio con \cmd{forktest}, il padre termina con
684 dei figli in stato di zombie: alla sua terminazione infatti tutti i suoi figli
685 vengono ereditati (compresi gli zombie) verranno adottati da \cmd{init}, il
686 quale provvederà a completarne la terminazione.
687
688 Si tenga presente infine che siccome gli zombie sono processi già terminati,
689 non c'è modo di eliminarli con il comando \cmd{kill}; l'unica possibilità è
690 quella di terminare il processo che li ha generati, in modo che \cmd{init}
691 possa adottarli e provvedere a concludere la terminazione.
692
693
694 \subsection{Le funzioni \texttt{wait} e  \texttt{waitpid}}
695 \label{sec:proc_wait}
696
697 Come accennato la funzioni che permettono di leggere lo stato di uscita di un
698 processo, e di completarne il processo di terminazione sono \func{wait} e
699 \func{waitpid}, il loro prototipo è:
700 \begin{functions}
701 \headdecl{sys/types.h}
702 \headdecl{sys/wait.h}
703 \funcdecl{pid\_t wait(int * status)} 
704 \funcdecl{pid\_t waitpid(pid\_t pid, int *status, int options)}
705 \end{functions}
706
707
708 Come abbiamo appena visto una delle azioni prese dal kernel alla terminazione
709 di un processo è quella di salvarne lo stato e mandare un segnale di
710 \macro{SIGCHLD} al padre (torneremo su questa parte in \secref{sec:sig_xxx}).
711
712
713 \subsection{Le funzioni \texttt{exec}}
714 \label{sec:proc_exec}
715
716
717
718
719 \section{Il controllo di accesso}
720 \label{sec:proc_perms}
721
722 In questa sezione esamineremo le problematiche relative al controllo di
723 accesso dal punto di vista del processi; gli identificativi usati, come questi
724 vengono modificati nella creazione e nel lancio di nuovi processi, e le varie
725 funzioni per la loro manipolazione diretta.
726
727
728 \subsection{Utente e gruppo di un processo}
729 \label{sec:proc_user_group}
730
731 Abbiamo già accennato in \secref{sec:intro_multiuser} ad ogni utente ed gruppo
732 sono associati due identificatori univoci, lo \acr{uid} e il \acr{gid} che li
733 contraddistinguono nei confronti del kernel. Questi identificatori stanno alla
734 base del sistema di permessi e protezioni di un sistema unix, e vengono usati
735 anche nella gestione dei privilegi di accesso dei processi.
736
737 In realtà ad ogni processo è associato un certo numero di identificatori, il
738 cui elenco è riportato \ntab, in genere questi derivano direttamente
739 dall'utente che ha lanciato il processo (attraverso i valori di \acr{uid} e
740 \acr{gid}), e vengono usati sia per il controllo di accesso ai file che per la
741 gestione dei privilegi associati ai processi stessi.
742 \begin{table}[htb]
743   \centering
744   \begin{tabular}[c]{|c|l|l|}
745     \hline
746     Sigla & Significato & Utilizzo \\ 
747     \hline
748     \hline
749     \acr{ruid} & \textit{real user id} & indica l'utente reale che ha lanciato
750     il programma\\ 
751     \acr{rgid} & \textit{real group id} & indica il gruppo reale dell'utente 
752     che ha lanciato il programma \\ 
753     \acr{euid} & \textit{effective user id} & indica l'utente effettivo usato
754     dal programma \\ 
755     \acr{egid} & \textit{effective group id} & indica il gruppo effettivo usato
756     dal programma \\ 
757                & \textit{supplementary group id} & indica i gruppi cui
758     l'utente appartiene  \\ 
759     \acr{suid} & \textit{saved user id} & indica l'utente  \\ 
760     \acr{sgid} & \textit{daved group id} & indica il gruppo  \\ 
761     \acr{fsuid} & \textit{filesystem user id} & indica l'utente effettivo per
762     il filesystem \\ 
763     \acr{fsgid} & \textit{filesystem group id} & indica il gruppo effettivo
764     per il filesystem  \\ 
765     \hline
766   \end{tabular}
767   \caption{Identificatori di utente e gruppo associati a ciascun processo.}
768   \label{tab:proc_uid_gid}
769 \end{table}
770
771 Il \textit{real user id} e il \textit{real group id} indicano l'utente che ha
772 lanciato il processo, e vengono settati al login al valore standard di
773 \acr{uid} e \acr{gid} dell'utente letti direttamente da \file{/etc/passwd}.
774 Questi non vengono mai cambiati nella creazione di nuovi processi e restano
775 sempre gli stessi per tutti i processi avviati in una sessione. In realtà è
776 possibile modificarli (vedi \secref{sec:proc_setuid}), ma solo per un processo
777 che abbia i privilegi di amministratore (ed è così infatti che \cmd{login},
778 che gira con i privilegi di amministratore, li setta ai valori corrispondenti
779 all'utente che entra nel sistema).
780
781 L'\textit{effective user id}, l'\textit{effective group id} e gli eventuali
782 \textit{supplementary group id} sono gli identificativi usati per il controllo
783 di accesso ai file secondo quanto descritto in dettaglio in
784 \secref{sec:file_perm_overview}. Normalmente sono uguali al \textit{real user
785   id} e al \textit{real group id}, a meno che il file posto in esecuzione non
786 abbia i bit \acr{suid} o \acr{sgid} settati, nel qual caso vengono settati
787 rispettivamente all'\acr{uid} e \acr{gid} del file.
788
789 Il \textit{saved user id} e il \textit{saved group id} sono copie
790 dell'\textit{effective user id} e dell'\textit{effective group id} del
791 processo padre, e vengono settati all'avvio del processo, prima che
792 \textit{effective user id} e \textit{effective group id} vengano modificati
793 per tener conto di eventuali \acr{suid} o \acr{sgid}.
794
795
796 \subsection{Le funzioni \texttt{setuid} e \texttt{setgid}}
797 \label{sec:proc_setuid}
798
799
800 \subsection{Le funzioni \texttt{seteuid} e \texttt{setegid}}
801 \label{sec:proc_seteuid}
802