Iniziate wait & waitpid
[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.  Si noti come la funzione \func{fork} ritorni
211 \textbf{due} volte: una nel padre e una nel figlio. La sola differenza che si
212 ha nei due processi è il valore di ritorno restituito dalla funzione, che nel
213 padre è il \acr{pid} del figlio mentre nel figlio è zero; in questo modo il
214 programma può identificare se viene eseguito dal padre o dal figlio.
215
216 La scelta di questi valori non è casuale, un processo infatti può avere più
217 figli, ed il valore di ritorno di \func{fork} è l'unico modo che permette di
218 identificare quello appena creato; al contrario un figlio ha sempre un solo
219 padre (il cui \acr{pid} può sempre essere ottenuto con \func{getppid}, vedi
220 \secref{sec:proc_pid}) e si usa il valore nullo, che non può essere il
221 \acr{pid} di nessun processo.
222
223 \begin{figure}[!htb]
224   \footnotesize
225   \begin{lstlisting}{}
226 #include <errno.h>       /* error definitions and routines */ 
227 #include <stdlib.h>      /* C standard library */
228 #include <unistd.h>      /* unix standard library */
229 #include <stdio.h>       /* standard I/O library */
230 #include <string.h>      /* string functions */
231
232 /* Help printing routine */
233 void usage(void);
234
235 int main(int argc, char *argv[])
236 {
237 /* 
238  * Variables definition  
239  */
240     int nchild, i;
241     pid_t pid;
242     int wait_child  = 0;
243     int wait_parent = 0;
244     int wait_end    = 0;
245     ...        /* handling options */
246     nchild = atoi(argv[optind]);
247     printf("Test for forking %d child\n", nchild);
248     /* loop to fork children */
249     for (i=0; i<nchild; i++) {
250         if ( (pid = fork()) < 0) { 
251             /* on error exit */ 
252             printf("Error on %d child creation, %s\n", i+1, strerror(errno));
253             exit(-1); 
254         }
255         if (pid == 0) {   /* child */
256             printf("Child %d successfully executing\n", ++i);
257             if (wait_child) sleep(wait_child);
258             printf("Child %d, parent %d, exiting\n", i, getppid());
259             exit(0);
260         } else {          /* parent */
261             printf("Spawned %d child, pid %d \n", i+1, pid);
262             if (wait_parent) sleep(wait_parent);
263             printf("Go to next child \n");
264         }
265     }
266     /* normal exit */
267     if (wait_end) sleep(wait_end);
268     return 0;
269 }
270   \end{lstlisting}
271   \caption{Esempio di codice per la creazione di nuovi processi.}
272   \label{fig:proc_fork_code}
273 \end{figure}
274
275 Normalmente la chiamata a \func{fork} può fallire solo per due ragioni, o ci
276 sono già troppi processi nel sistema (il che di solito è sintomo che
277 qualcos'altro non sta andando per il verso giusto) o si è ecceduto il limite
278 sul numero totale di processi permessi all'utente (il valore della costante
279 \macro{CHILD\_MAX} definito in \file{limits.h}, che fa riferimento ai processo
280 con lo stesso \textit{real user id}).
281
282 L'uso di \func{fork} avviene secondo due modalità principali; la prima è
283 quella in cui all'interno di un programma si creano processi figli per
284 affidargli l'esecuzione di una certa sezione di codice, mentre il processo
285 padre ne esegue un'altra. È il caso tipico dei server di rete in cui il padre
286 riceve ed accetta le richieste da parte dei client, per ciascuna delle quali
287 pone in esecuzione un figlio che è incaricato di fornire il servizio.
288
289 La seconda modalità è quella in cui il processo vuole eseguire un altro
290 programma; questo è ad esempio il caso della shell. In questo caso il processo
291 crea un figlio la cui unica operazione è quella fare una \func{exec} (di cui
292 parleremo in \secref{sec:proc_exec}) subito dopo la \func{fork}.
293
294 Alcuni sistemi operativi (il VMS ad esempio) combinano le operazioni di questa
295 seconda modalità (una \func{fork} seguita da una \func{exec}) in un'unica
296 operazione che viene chiamata \textit{spawn}. Nei sistemi unix-like è stato
297 scelto di mantenere questa separazione, dato che, come visto per la prima
298 modalità d'uso, esistono numerosi scenari in cui si può usare una \func{fork}
299 senza bisogno di una \func{exec}. Inoltre anche nel caso della seconda
300 modalità di operazioni, avere le due funzioni separate permette al figlio di
301 cambiare gli attributi del processo (maschera dei segnali, redirezione
302 dell'output, \textit{user id}) prima della \func{exec}, rendendo molto più
303 flessibile la possibilità di modificare gli attributi del nuovo processo.
304
305 In \curfig\ si è riportato il corpo del codice del programma di esempio
306 \cmd{forktest}, che ci permette di illustrare molte caratteristiche dell'uso
307 della funzione \func{fork}. Il programma permette di creare un numero di figli
308 specificato a linea di comando, e prende anche alcune opzioni per indicare
309 degli eventuali tempi di attesa in secondi (eseguiti tramite la funzione
310 \func{sleep}) per il padre ed il figlio (con \cmd{forktest -h} si ottiene la
311 descrizione delle opzioni); il codice completo, compresa la parte che gestisce
312 le opzioni a riga di comando, è disponibile nel file \file{ForkTest.c}.
313
314 Decifrato il numero di figli da creare, il ciclo principale del programma
315 (\texttt{\small 28--40}) esegue in successione la creazione dei processi figli
316 controllando il successo della chiamata a \func{fork} (\texttt{\small
317   29--31}); ciascun figlio (\texttt{\small 29--31}) si limita a stampare il
318 suo numero di successione, eventualmente attendere il numero di secondi
319 specificato e scrivere un messaggio prima di uscire. Il processo padre invece
320 (\texttt{\small 29--31}) stampa un messaggio di creazione, eventualmente
321 attende il numero di secondi specificato, e procede nell'esecuzione del ciclo;
322 alla conclusione del ciclo, prima di uscire, può essere specificato un altro
323 periodo di attesa.
324
325 Se eseguiamo il comando senza specificare attese (come si può notare in
326 \texttt{\small 17--19} i valori di default specificano di non attendere),
327 otterremo come output sul terminale:
328 \begin{verbatim}
329 [piccardi@selidor sources]$ ./forktest 3
330 Test for forking 3 child
331 Spawned 1 child, pid 1964 
332 Child 1 successfully executing
333 Child 1, parent 1963, exiting
334 Go to next child 
335 Spawned 2 child, pid 1965 
336 Child 2 successfully executing
337 Child 2, parent 1963, exiting
338 Go to next child 
339 Child 3 successfully executing
340 Child 3, parent 1963, exiting
341 Spawned 3 child, pid 1966 
342 Go to next child 
343 \end{verbatim} %$
344
345 Esaminiamo questo risultato: una prima conclusione che si può trarre è non si
346 può dire quale processo fra il padre ed il figlio venga eseguito per
347 primo\footnote{anche se nel kernel 2.4.x era stato introdotto un meccanismo
348   che metteva in esecuzione sempre il xxx per primo (TODO recuperare le
349   informazioni esatte)} dopo la chiamata a \func{fork}; dall'esempio si può
350 notare infatti come nei primi due cicli sia stato eseguito per primo il padre
351 (con la stampa del \acr{pid} del nuovo processo) per poi passare
352 all'esecuzione del figlio (completata con i due avvisi di esecuzione ed
353 uscita), e tornare all'esecuzione del padre (con la stampa del passaggio al
354 ciclo successivo), mentre la terza volta è stato prima eseguito il figlio
355 (fino alla conclusione) e poi il padre.
356
357 In generale l'ordine di esecuzione dipenderà, oltre che dall'algoritmo di
358 scheduling usato dal kernel, dalla particolare situazione in si trova la
359 macchina al momento della chiamata, risultando del tutto impredicibile.
360 Eseguendo più volte il programma di prova e producendo un numero diverso di
361 figli, si sono ottenute situazioni completamente diverse, compreso il caso in
362 cui il processo padre ha eseguito più di una \func{fork} prima che uno dei
363 figli venisse messo in esecuzione.
364
365 Pertanto non si può fare nessuna assunzione sulla sequenza di esecuzione delle
366 istruzioni del codice fra padre e figli, nè sull'ordine in cui questi potranno
367 essere messi in esecuzione, e se è necessaria una qualche forma di precedenza
368 occorrerà provvedere ad espliciti meccanismi di sincronizzazione, pena il
369 rischio di incorrere nelle cosiddette \textit{race conditions}.
370
371 Si noti inoltre che, come accennato, essendo i segmenti di memoria utilizzati
372 dai singoli processi completamente separati, le modifiche delle variabili nei
373 processi figli (come l'incremento di \var{i} in \texttt{\small 33}) sono
374 visibili solo al loro interno, e non hanno alcun effetto sul valore che le
375 stesse variabili hanno nel processo padre (ed in eventuali altri processi
376 figli che eseguano lo stesso codice).
377
378 Un secondo aspetto molto importante nella creazione dei processi figli è
379 quello dell'interazione dei vari processi con i file; per illustrarlo meglio
380 proviamo a redirigere su un file l'output del nostro programma di test, quello
381 che otterremo è:
382 \begin{verbatim}
383 [piccardi@selidor sources]$ ./forktest 3 > output
384 [piccardi@selidor sources]$ cat output
385 Test for forking 3 child
386 Child 1 successfully executing
387 Child 1, parent 1967, exiting
388 Test for forking 3 child
389 Spawned 1 child, pid 1968 
390 Go to next child 
391 Child 2 successfully executing
392 Child 2, parent 1967, exiting
393 Test for forking 3 child
394 Spawned 1 child, pid 1968 
395 Go to next child 
396 Spawned 2 child, pid 1969 
397 Go to next child 
398 Child 3 successfully executing
399 Child 3, parent 1967, exiting
400 Test for forking 3 child
401 Spawned 1 child, pid 1968 
402 Go to next child 
403 Spawned 2 child, pid 1969 
404 Go to next child 
405 Spawned 3 child, pid 1970 
406 Go to next child 
407 \end{verbatim}
408 che come si vede è completamente diverso da quanto ottenevamo sul terminale.
409
410 Il comportamento delle varie funzioni di interfaccia con i file è analizzato
411 in gran dettaglio in \capref{cha:file_unix_interface} e in
412 \secref{cha:files_std_interface}. Qui basta accennare che si sono usate le
413 funzioni standard della libreria del C che prevedono l'output bufferizzato; e
414 questa bufferizzazione varia a seconda che si tratti di un file su disco (in
415 cui il buffer viene scaricato su disco solo quando necessario) o di un
416 terminale (nel qual caso il buffer viene scaricato ad ogni a capo).
417
418 Nel primo esempio allora avevamo che ad ogni chiamata a \func{printf} il
419 buffer veniva scaricato, e le singole righe erano stampate a video subito dopo
420 l'esecuzione della \func{printf}. Ma con la redirezione su file la scrittura
421 non avviene più alla fine di ogni riga e l'output resta nel buffer, per questo
422 motivo, dato che ogni figlio riceve una copia della memoria del padre, esso
423 riceverà anche quanto c'è nel buffer delle funzioni di I/O, comprese le linee
424 scritte dal padre fino allora. Così quando all'uscita del figlio il buffer
425 viene scritto su disco, troveremo nel file anche tutto quello che il processo
426 padre aveva scritto prima della sua creazione.  E alla fine del file, dato che
427 in questo caso il padre esce per ultimo, troviamo anche l'output del padre.
428
429 Ma l'esempio ci mostra un'altro aspetto fondamentale dell'interazione con i
430 file, che era valido anche per l'esempio precedente, ma meno evidente; il
431 fatto cioè che non solo processi diversi possono scrivere in contemporanea
432 sullo stesso file (l'argomento della condivisione dei file in unix è trattato
433 in dettaglio in \secref{sec:file_sharing}), ma anche che, a differenza di
434 quanto avviene per le variabili, la posizione corrente sul file è condivisa 
435 fra il padre e tutti i processi figli. 
436
437 Quello che succede è che quando lo standard output del padre viene rediretto,
438 lo stesso avviene anche per tutti i figli; la funzione \func{fork} infatti ha
439 la caratteristica di duplicare (allo stesso modo in cui lo fa la funzione
440 \func{dup}, trattata in \secref{sec:file_dup}) nei figli tutti i file
441 descriptor aperti nel padre, il che comporta che padre e figli condividono
442 le stesse voci della file table (per la spiegazione di questi termini si veda
443 \secref{sec:file_sharing} e referenza a figura da fare) e quindi anche
444 l'offset corrente nel file.
445
446 In questo modo se un processo scrive sul file aggiornerà l'offset sulla file
447 table, e tutti gli altri processi che condividono la file table vedranno il
448 nuovo valore; in questo modo si evita, in casi come quello appena mostrato in
449 cui diversi processi scrivono sullo stesso file, che l'output successivo di un
450 processo vada a sovrapporsi a quello dei precedenti (l'output potrà risultare
451 mescolato, ma non ci saranno parti perdute per via di una sovrascrittura).
452
453 Questo tipo di comportamento è essenziale in tutti quei casi in cui il padre
454 crea un figlio ed attende la sua conclusione per proseguire, ed entrambi
455 scrivono sullo stesso file, ad esempio lo standard output (un caso tipico è la
456 shell). Se l'output viene rediretto con questo comportamento avremo che il
457 padre potrà continuare a scrivere automaticamente in coda a quanto scritto dal
458 figlio; se così non fosse ottenere questo comportamento sarebbe estremamente
459 complesso necessitando di una qualche forma di comunicazione fra i due
460 processi.
461
462 In generale comunque non è buona norma far scrivere più processi sullo stesso
463 file senza una qualche forma di sincronizzazione in quanto, come visto con il
464 nostro esempio, le varie scritture risulteranno mescolate fra loro in una
465 sequenza impredicibile. Le modalità con cui in genere si usano i file dopo una
466 \func{fork} sono sostanzialmente due:
467 \begin{enumerate}
468 \item Il processo padre aspetta la conclusione del figlio. In questo caso non
469   è necessaria nessuna azione riguardo ai file, in quanto la sincronizzazione
470   degli offset dopo eventuali operazioni di lettura e scrittura effettuate dal
471   figlio è automatica.
472 \item L'esecuzione di padre e figlio procede indipendentemente. In questo caso
473   ciascuno dei due deve chiudere i file che non gli servono una volta che la
474   \func{fork} è stata eseguita, per evitare ogni forma di interferenza.
475 \end{enumerate}
476
477 Oltre ai file aperti i processi figli ereditano dal padre una serie di altre
478 proprietà comuni; in dettaglio avremo che dopo l'esecuzione di una \func{fork}
479 padre e figlio avranno in comune:
480 \begin{itemize}
481 \item i file aperti (e gli eventuali flag di \textit{close-on-exec} se
482   settati).
483 \item gli identificatori per il controllo di accesso: il \textit{real user
484     id}, il \textit{real group id}, l'\textit{effective user id},
485   l'\textit{effective group id} e i \textit{supplementary group id} (vedi
486   \secref{tab:proc_uid_gid}).
487 \item gli identificatori per il controllo di sessione: il \textit{process
488     group id} e il \textit{session id} e il terminale di controllo.
489 \item i flag \acr{suid} e \acr{suid} (vedi \secref{sec:file_suid_sgid}).
490 \item la directory di lavoro e la directory radice (vedi
491   \secref{sec:file_work_dir}).
492 \item la maschera dei permessi di creazione (vedi \secref{sec:file_umask}).
493 \item la maschera dei segnali.
494 \item i segmenti di memoria condivisa agganciati al processo. 
495 \item i limiti sulle risorse
496 \item le variabili di ambiente (vedi \secref{sec:proc_environ}).
497 \end{itemize}
498 le differenze invece sono:
499 \begin{itemize}
500 \item il valore di ritorno di \func{fork}.
501 \item il \textit{process id}. 
502 \item il \textit{parent process id} (quello del figlio viene settato al
503   \acr{pid} del padre).
504 \item i valori dei tempi di esecuzione (\var{tms\_utime}, \var{tms\_stime},
505   \var{tms\_cutime}, \var{tms\_uetime}) che nel figlio sono posti a zero.
506 \item i \textit{file lock}, che non vengono ereditati dal figlio.
507 \item gli allarmi pendenti, che per il figlio vengono cancellati.
508 \end{itemize}
509
510
511 \subsection{La funzione \func{vfork}}
512 \label{sec:proc_vfork}
513
514 La funzione \func{vfork} è esattamente identica a \func{fork} ed ha la stessa
515 semantica e gli stessi errori; la sola differenza è che non viene creata la
516 tabella delle pagine né la struttura dei task per il nuovo processo. Il
517 processo padre è posto in attesa fintanto che il figlio non ha eseguito una
518 \func{execve} o non è uscito con una \func{\_exit}. Il figlio condivide la
519 memoria del padre (e modifiche possono avere effetti imprevedibili) e non deve
520 ritornare o uscire con \func{exit} ma usare esplicitamente \func{\_exit}.
521
522 Questa funzione è un rimasuglio dei vecchi tempi in cui eseguire una
523 \func{fork} comportava anche la copia completa del segmento dati del processo
524 padre, che costituiva un inutile appesantimento in tutti quei casi in cui la
525 \func{fork} veniva fatto solo per poi eseguire una \func{exec}. La funzione
526 venne introdotta in BSD per migliorare le prestazioni.
527
528 Dato che Linux supporta il \textit{copy on write} la perdita di prestazioni è
529 assolutamente trascurabile, e l'uso di questa funzione (che resta un caso
530 speciale della funzione \func{clone}), è deprecato, per questo eviteremo di
531 trattarla ulteriormente.
532
533
534 \subsection{La conclusione di un processo.}
535 \label{sec:proc_termination}
536
537 In \secref{sec:proc_conclusion} abbiamo già affrontato le modalità con cui
538 concludere un programma, ma dal punto di vista del programma stesso; avendo a
539 che fare con un sistema multitasking occorre adesso affrontare l'argomento dal
540 punto di vista generale di come il sistema gestisce la conclusione dei
541 processi.
542
543 Abbiamo già visto in \secref{sec:proc_conclusion} le tre modalità con cui un
544 programma viene terminato in maniera normale: la chiamata di \func{exit} (che
545 esegue le funzioni registrate per l'uscita e chiude gli stream), il ritorno
546 dalla funzione \func{main} (equivalente alla chiamata di \func{exit}), e la
547 chiamata ad \func{\_exit} (che passa direttamente alle operazioni di
548 terminazione del processo da parte del kernel).
549
550 Ma oltre alla conclusione normale abbiamo accennato che esistono anche delle
551 modalità di conclusione anomala; queste sono in sostanza due: il programma può
552 chiamare la funzione \func{abort} per invocare una chiusura anomala, o essere
553 terminato da un segnale.  In realtà anche la prima modalità si riconduce alla
554 seconda, dato che \func{abort} si limita a generare il segnale
555 \macro{SIGABRT}.
556
557 Qualunque sia la modalità di conclusione di un processo, il kernel esegue
558 comunque una serie di operazioni: chiude tutti i file aperti, rilascia la
559 memoria che stava usando, e così via; l'elenco completo delle operazioni
560 eseguite alla chiusura di un processo è il seguente:
561 \begin{itemize}
562 \item tutti i descrittori dei file sono chiusi.
563 \item viene memorizzato lo stato di terminazione del processo.
564 \item ad ogni processo figlio viene assegnato un nuovo padre.
565 \item viene inviato il segnale \macro{SIGCHLD} al processo padre.
566 \item se il processo è un leader di sessione viene mandato un segnale di
567   \macro{SIGHUP} a tutti i processi in background e il terminale di controllo
568   viene disconnesso.
569 \item se la conclusione di un processe rende orfano un \textit{process group}
570   ciascun membro del gruppo viene bloccato, e poi gli vengono inviati in
571   successione i segnali \macro{SIGHUP} e \macro{SIGCONT}.
572 \end{itemize}
573 ma al di la di queste operazioni è necessario poter disporre di un meccanismo
574 ulteriore che consenta di sapere come questa terminazione è avvenuta; dato che
575 in un sistema unix-like tutto viene gestito attraverso i processi il
576 meccanismo scelto consiste nel riportare lo stato di terminazione
577 (\textit{termination status}) di cui sopra al processo padre.
578
579 Nel caso di conclusione normale, lo stato di uscita del processo viene
580 caratterizzato tremite il valore del cosiddetto \textit{exit status}, cioè il
581 valore passato alle funzioni \func{exit} o \func{\_exit} (o dal valore di
582 ritorno per \func{main}).  Ma se il processo viene concluso in maniera anomala
583 il programma non può specificare nessun \textit{exit status}, ed è il kernel
584 che deve generare autonomamente il \textit{termination status} per indicare le
585 ragioni della conclusione anomala.  
586
587 Si noti la distinzione fra \textit{exit status} e \textit{termination status}:
588 quello che contraddistingue lo stato di chiusura del processo e viene
589 riportato attraverso le funzioni \func{wait} o \func{waitpid} (vedi
590 \secref{sec:proc_wait}) è sempre quest'ultimo; in caso di conclusione normale
591 il kernel usa il primo (nel codice eseguito da \func{\_exit}) per produrre il
592 secondo.
593
594 La scelta di riportare al padre lo stato di terminazione dei figli, pur
595 essendo l'unica possibile, comporta comunque alcune complicazioni: infatti se
596 alla sua creazione è scontato che ogni nuovo processo ha un padre, non è detto
597 che sia così alla sua conclusione, dato che il padre protrebbe essere già
598 terminato (si potrebbe avere cioè quello che si chiama un processo
599 \textsl{orfano}). 
600
601 Questa complicazione viene superata facendo in modo che il processo figlio
602 venga \textsl{adottato} da \cmd{init}: come già accennato quando un processo
603 termina il kernel controlla se è il padre di altri processi in esecuzione: in
604 caso positivo allora il \acr{ppid} di tutti questi processi viene sostituito
605 con il \acr{pid} di \cmd{init} (e cioè con 1); in questo modo ogni processo
606 avrà sempre un padre (nel caso \textsl{adottivo}) cui riportare il suo stato
607 di terminazione.  Come verifica di questo comportamento eseguiamo il comando
608 \cmd{forktest -c2 3}, in questo modo ciascun figlio attenderà due secondi
609 prima di uscire, il risultato è:
610 \begin{verbatim}
611 [piccardi@selidor sources]$ ./forktest -c2 3
612 Test for forking 3 child
613 Spawned 1 child, pid 1973 
614 Child 1 successfully executing
615 Go to next child 
616 Spawned 2 child, pid 1974 
617 Child 2 successfully executing
618 Go to next child 
619 Child 3 successfully executing
620 Spawned 3 child, pid 1975 
621 Go to next child 
622 [piccardi@selidor sources]$ Child 3, parent 1, exiting
623 Child 2, parent 1, exiting
624 Child 1, parent 1, exiting
625 \end{verbatim}
626 come si può notare in questo caso il processo padre si conclude prima dei
627 figli, tornando alla shell, che stampa il prompt sul terminale: circa due
628 secondi dopo viene stampato a video anche l'output dei tre figli che
629 terminano, e come si può notare in questo caso, al contrario di quanto visto
630 in precedenza, essi riportano 1 come \acr{ppid}.
631
632 Altrettanto rilevante è il caso in cui il figlio termina prima del padre,
633 questo perché non è detto che il padre possa ricevere immediatamente lo stato
634 di terminazione, quindi il kernel deve comunque conservare una certa quantità
635 di informazioni riguardo ai processi che sta terminando.
636
637 Questo viene fatto mantenendo attiva la voce nella tabella dei processi, e
638 memorizzando alcuni dati essenziali, come il \acr{pid}, i tempi di CPU usati
639 dal processo (vedi \secref{sec:intro_unix_time}) e lo stato di terminazione
640 (NdA verificare esattamente cosa c'è!), mentre la memoria in uso ed i file
641 aperti vengono rilasciati immediatamente. I processi che sono terminati, ma il
642 cui stato di terminazione non è stato ancora ricevuto dal padre sono chiamati
643 \textit{zombie}, essi restano presenti nella tabella dei processi ed in genere
644 possono essere identificati dall'output di \cmd{ps} per la presenza di una
645 \cmd{Z} nella colonna che ne indica lo stato. Quando il padre effettuarà la
646 lettura dello stato di uscita anche questa informazione, non più necessaria,
647 verrà scartata e la terminazione potrà dirsi completamente conclusa.
648
649 Possiamo utilizzare il nostro programma di prova per analizzare anche questa
650 condizione: lanciamo il comando \cmd{forktest -e10 3 \&} in background,
651 indicando al processo padre di aspettare 10 secondi prima di uscire; in questo
652 caso, usando \cmd{ps} sullo stesso terminale (prima dello scadere dei 10
653 secondi) otterremo:
654 \begin{verbatim}
655 [piccardi@selidor sources]$ ps T
656   PID TTY      STAT   TIME COMMAND
657   419 pts/0    S      0:00 bash
658   568 pts/0    S      0:00 ./forktest -e10 3
659   569 pts/0    Z      0:00 [forktest <defunct>]
660   570 pts/0    Z      0:00 [forktest <defunct>]
661   571 pts/0    Z      0:00 [forktest <defunct>]
662   572 pts/0    R      0:00 ps T
663 \end{verbatim} %$
664 e come si vede, dato che non si è fatto nulla per riceverne lo stato di
665 terminazione, i tre processi figli sono ancora presenti pur essendosi
666 conclusi, con lo stato di zombie e l'indicazione che sono stati terminati.
667
668 La possibilità di avere degli zombie deve essere tenuta sempre presente quando
669 si scrive un programma che deve essere mantenuto in esecuzione a lungo e
670 creare molti figli. In questo caso si deve sempre avere cura di far leggere
671 l'eventuale stato di uscita di tutti i figli (in genere questo si fa
672 attraverso un apposito \textit{signal handler}, che chiama la funzione
673 \func{wait}, vedi \secref{sec:sig_xxx} e \secref{sec:proc_wait}). Questa
674 operazione è necessaria perché anche se gli \textit{zombie} non consumano
675 risorse di memoria o processore, occupano comunque una voce nella tabella dei
676 processi, che a lungo andare potrebbe esaurirsi.
677
678 Si noti che quando un processo adottato da \cmd{init} termina, esso non
679 diviene uno \textit{zombie}; questo perché una delle funzioni di \cmd{init} è
680 appunto quella di chiamare la funzione \func{wait} per i processi cui fa da
681 padre, completandone la terminazione. Questo è quanto avviene anche quando,
682 come nel caso del precedente esempio con \cmd{forktest}, il padre termina con
683 dei figli in stato di zombie: alla sua terminazione infatti tutti i suoi figli
684 vengono ereditati (compresi gli zombie) verranno adottati da \cmd{init}, il
685 quale provvederà a completarne la terminazione.
686
687 Si tenga presente infine che siccome gli zombie sono processi già terminati,
688 non c'è modo di eliminarli con il comando \cmd{kill}; l'unica possibilità è
689 quella di terminare il processo che li ha generati, in modo che \cmd{init}
690 possa adottarli e provvedere a concludere la terminazione.
691
692
693 \subsection{Le funzioni \texttt{wait} e  \texttt{waitpid}}
694 \label{sec:proc_wait}
695
696 Abbiamo già visto in precedenza come uno degli usi possibili delle capacità
697 multitasking di un sistema unix-like consiste nella creazione di programmi di
698 tipo server, in cui un processo principale attende le richieste che vengono
699 poi soddisfatte creando una serie di processi figli. Si è gia sottolineato
700 come in questo caso diventi necessario gestire esplicitamente la conclusione
701 dei vari processi figli; le funzioni deputate a questo sono sostanzialmente
702 due, \func{wait} e \func{waitpid}. La prima, il cui prototipo è:
703 \begin{functions}
704 \headdecl{sys/types.h}
705 \headdecl{sys/wait.h}
706 \funcdecl{pid\_t wait(int * status)} 
707
708 Sospende il processo corrente finché un figlio non è uscito, o finché un
709 segnale termina il processo o chiama una funzione di gestione. Se un figlio è
710 già uscito la funzione ritorna immediatamente. Al ritorno lo stato di
711 termininazione del processo viene salvato nella variabile puntata da
712 \var{status} e tutte le informazioni relative al processo (vedi
713 \secref{sec:proc_termination}) vengono rilasciate.
714
715 La funzione restituisce il \acr{pid} del figlio in caso di successo e -1 in
716 caso di errore; \var{errno} può assumere i valori:
717   \begin{errlist}
718   \item \macro{EINTR} la funzione è stata interrotta da un segnale.
719   \end{errlist}
720 \end{functions}
721 è presente fin dalle prime versioni di unix; la funzione ritorna alla
722 conclusione del primo figlio (o immediatamente se un figlio è già uscito), nel
723 caso un processo abbia più figli il valore di ritorno permette di identificare
724 qual'è quello che è uscito.
725
726 Questa funzione però ha il difetto di essere poco flessibile, in quanto
727 ritorna all'uscita di un figlio qualunque, per cui se si vuole attendere la
728 conclusione di un processo specifico occorre predisporre un meccanismo che
729 tenga conto dei processi già terminati, e ripeta la chiamata alla funzione nel
730 caso il processo cercato sia ancora attivo.
731
732 Per questo motivo lo standard Posix.1 ha introdotto \func{waitpid} che
733 effettua lo stesso servizio, ma dispone di una serie di funzionalità più
734 ampie; il suo prototipo è:
735 \begin{functions}
736 \headdecl{sys/types.h}
737 \headdecl{sys/wait.h}
738 \funcdecl{pid\_t waitpid(pid\_t pid, int * status, int options)} 
739
740 La funzione restituisce il \acr{pid} del figlio che è uscito, 0 se è stata
741 specificata l'opzione \macro{WNOHANG} e il figlio non è uscito e -1 per un
742 errore, nel qual caso \var{errno} assumerà i valori:
743   \begin{errlist}
744   \item \macro{EINTR} non è stata specificata l'opzione \macro{WNOHANG} e la
745     funzione è stata interrotta da un segnale.
746   \item \macro{ECHILD} il processo specificato da \var{pid} non esiste o non è
747     figlio del processo chiamante.
748   \end{errlist}
749 \end{functions}
750
751 Le differenze principali fra le due funzioni sono che \func{wait} si blocca
752 sempre fino a che un figlio non termina, mentre \func{waitpid} ha la
753 possibilità si specificare un'opzione, \macro{WNOHANG} che ne previene il
754 blocco, inoltre \func{waitpid} può specificare quale figlio attendere sulla
755 base del valore soecificato tramite la variabile \var{pid} secondo lo
756 specchietto riportato in \ntab:
757 \begin{table}[!htb]
758   \centering
759   \begin{tabular}[c]{|c|p{10cm}|}
760     \hline
761     \textbf{Valore} & \textbf{Significato}\\
762     \hline
763     \hline
764     -1  & attende per un figlio qualsiasi, equivalente a \func{wait}\\ 
765     > 0 & \\
766     0   & \\
767     < -1& \\
768     \hline
769   \end{tabular}
770   \caption{Significato del parametro \var{pid} della funzione \func{waitpid}.}
771   \label{tab:proc_waidpid_pid}
772 \end{table}
773
774
775
776 Come abbiamo appena visto una delle azioni prese dal kernel alla terminazione
777 di un processo è quella di salvarne lo stato e mandare un segnale di
778 \macro{SIGCHLD} al padre (torneremo su questa parte in \secref{sec:sig_xxx}).
779
780
781 \subsection{Le funzioni \texttt{exec}}
782 \label{sec:proc_exec}
783
784
785
786
787 \section{Il controllo di accesso}
788 \label{sec:proc_perms}
789
790 In questa sezione esamineremo le problematiche relative al controllo di
791 accesso dal punto di vista del processi; gli identificativi usati, come questi
792 vengono modificati nella creazione e nel lancio di nuovi processi, e le varie
793 funzioni per la loro manipolazione diretta.
794
795
796 \subsection{Utente e gruppo di un processo}
797 \label{sec:proc_user_group}
798
799 Abbiamo già accennato in \secref{sec:intro_multiuser} ad ogni utente ed gruppo
800 sono associati due identificatori univoci, lo \acr{uid} e il \acr{gid} che li
801 contraddistinguono nei confronti del kernel. Questi identificatori stanno alla
802 base del sistema di permessi e protezioni di un sistema unix, e vengono usati
803 anche nella gestione dei privilegi di accesso dei processi.
804
805 In realtà ad ogni processo è associato un certo numero di identificatori, il
806 cui elenco è riportato \ntab, in genere questi derivano direttamente
807 dall'utente che ha lanciato il processo (attraverso i valori di \acr{uid} e
808 \acr{gid}), e vengono usati sia per il controllo di accesso ai file che per la
809 gestione dei privilegi associati ai processi stessi.
810 \begin{table}[htb]
811   \centering
812   \begin{tabular}[c]{|c|l|l|}
813     \hline
814     Sigla & Significato & Utilizzo \\ 
815     \hline
816     \hline
817     \acr{ruid} & \textit{real user id} & indica l'utente reale che ha lanciato
818     il programma\\ 
819     \acr{rgid} & \textit{real group id} & indica il gruppo reale dell'utente 
820     che ha lanciato il programma \\ 
821     \acr{euid} & \textit{effective user id} & indica l'utente effettivo usato
822     dal programma \\ 
823     \acr{egid} & \textit{effective group id} & indica il gruppo effettivo usato
824     dal programma \\ 
825                & \textit{supplementary group id} & indica i gruppi cui
826     l'utente appartiene  \\ 
827     \acr{suid} & \textit{saved user id} & indica l'utente  \\ 
828     \acr{sgid} & \textit{daved group id} & indica il gruppo  \\ 
829     \acr{fsuid} & \textit{filesystem user id} & indica l'utente effettivo per
830     il filesystem \\ 
831     \acr{fsgid} & \textit{filesystem group id} & indica il gruppo effettivo
832     per il filesystem  \\ 
833     \hline
834   \end{tabular}
835   \caption{Identificatori di utente e gruppo associati a ciascun processo.}
836   \label{tab:proc_uid_gid}
837 \end{table}
838
839 Il \textit{real user id} e il \textit{real group id} indicano l'utente che ha
840 lanciato il processo, e vengono settati al login al valore standard di
841 \acr{uid} e \acr{gid} dell'utente letti direttamente da \file{/etc/passwd}.
842 Questi non vengono mai cambiati nella creazione di nuovi processi e restano
843 sempre gli stessi per tutti i processi avviati in una sessione. In realtà è
844 possibile modificarli (vedi \secref{sec:proc_setuid}), ma solo per un processo
845 che abbia i privilegi di amministratore (ed è così infatti che \cmd{login},
846 che gira con i privilegi di amministratore, li setta ai valori corrispondenti
847 all'utente che entra nel sistema).
848
849 L'\textit{effective user id}, l'\textit{effective group id} e gli eventuali
850 \textit{supplementary group id} sono gli identificativi usati per il controllo
851 di accesso ai file secondo quanto descritto in dettaglio in
852 \secref{sec:file_perm_overview}. Normalmente sono uguali al \textit{real user
853   id} e al \textit{real group id}, a meno che il file posto in esecuzione non
854 abbia i bit \acr{suid} o \acr{sgid} settati, nel qual caso vengono settati
855 rispettivamente all'\acr{uid} e \acr{gid} del file.
856
857 Il \textit{saved user id} e il \textit{saved group id} sono copie
858 dell'\textit{effective user id} e dell'\textit{effective group id} del
859 processo padre, e vengono settati all'avvio del processo, prima che
860 \textit{effective user id} e \textit{effective group id} vengano modificati
861 per tener conto di eventuali \acr{suid} o \acr{sgid}.
862
863
864 \subsection{Le funzioni \texttt{setuid} e \texttt{setgid}}
865 \label{sec:proc_setuid}
866
867
868 \subsection{Le funzioni \texttt{seteuid} e \texttt{setegid}}
869 \label{sec:proc_seteuid}
870