cc64ab80a9210683e22b5e6b6bf61cdf0a1d6356
[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 tutte le operazioni
5 vengono svolte tramite opportuni processi.  In sostanza questi ultimi vengono
6 a costituire l'unità base per l'allocazione e l'uso delle risorse del sistema.
7
8 Nel precedente capitolo abbiamo esaminato il funzionamento di un processo come
9 unità a se stante, in questo esamineremo il funzionamento dei processi
10 all'interno del sistema. Saranno cioè affrontati i dettagli della creazione e
11 della terminazione dei processi, della gestione dei loro attributi e
12 privilegi, e di tutte le funzioni a questo connesse. Infine nella sezione
13 finale introdurremo alcune problematiche generiche della programmazione in
14 ambiente multitasking.
15
16
17 \section{Introduzione}
18 \label{sec:proc_gen}
19
20 Inizieremo con un'introduzione generale ai concetti che stanno alla base della
21 gestione dei processi in un sistema unix-like. Introdurremo in questa sezione
22 l'architettura della gestione dei processi e le sue principali
23 caratteristiche, dando una panoramica sull'uso delle principali funzioni di
24 gestione.
25
26
27 \subsection{L'architettura della gestione dei processi}
28 \label{sec:proc_hierarchy}
29
30 A differenza di quanto avviene in altri sistemi (ad esempio nel VMS la
31 generazione di nuovi processi è un'operazione privilegiata) una delle
32 caratteristiche di Unix (che esamineremo in dettaglio più avanti) è che
33 qualunque processo può a sua volta generarne altri, detti processi figli
34 (\textit{child process}). Ogni processo è identificato presso il sistema da un
35 numero unico, il cosiddetto \textit{process identifier} o, più brevemente, 
36 \acr{pid}.
37
38 Una seconda caratteristica di un sistema Unix è che la generazione di un
39 processo è un'operazione separata rispetto al lancio di un programma. In
40 genere la sequenza è sempre quella di creare un nuovo processo, il quale
41 eseguirà, in un passo successivo, il programma desiderato: questo è ad esempio
42 quello che fa la shell quando mette in esecuzione il programma che gli
43 indichiamo nella linea di comando.
44
45 Una terza caratteristica è che ogni processo è sempre stato generato da un
46 altro, che viene chiamato processo padre (\textit{parent process}). Questo
47 vale per tutti i processi, con una sola eccezione: dato che ci deve essere un
48 punto di partenza esiste un processo speciale (che normalmente è
49 \cmd{/sbin/init}), che viene lanciato dal kernel alla conclusione della fase
50 di avvio; essendo questo il primo processo lanciato dal sistema ha sempre il
51 \acr{pid} uguale a 1 e non è figlio di nessun altro processo.
52
53 Ovviamente \cmd{init} è un processo speciale che in genere si occupa di far
54 partire tutti gli altri processi necessari al funzionamento del sistema,
55 inoltre \cmd{init} è essenziale per svolgere una serie di compiti
56 amministrativi nelle operazioni ordinarie del sistema (torneremo su alcuni di
57 essi in \secref{sec:proc_termination}) e non può mai essere terminato. La
58 struttura del sistema comunque consente di lanciare al posto di \cmd{init}
59 qualunque altro programma, e in casi di emergenza (ad esempio se il file di
60 \cmd{init} si fosse corrotto) è ad esempio possibile lanciare una shell al suo
61 posto, passando la riga \cmd{init=/bin/sh} come parametro di avvio.
62
63 \begin{figure}[!htb]
64   \footnotesize
65 \begin{verbatim}
66 [piccardi@gont piccardi]$ pstree -n 
67 init-+-keventd
68      |-kapm-idled
69      |-kreiserfsd
70      |-portmap
71      |-syslogd
72      |-klogd
73      |-named
74      |-rpc.statd
75      |-gpm
76      |-inetd
77      |-junkbuster
78      |-master-+-qmgr
79      |        `-pickup
80      |-sshd
81      |-xfs
82      |-cron
83      |-bash---startx---xinit-+-XFree86
84      |                       `-WindowMaker-+-ssh-agent
85      |                                     |-wmtime
86      |                                     |-wmmon
87      |                                     |-wmmount
88      |                                     |-wmppp
89      |                                     |-wmcube
90      |                                     |-wmmixer
91      |                                     |-wmgtemp
92      |                                     |-wterm---bash---pstree
93      |                                     `-wterm---bash-+-emacs
94      |                                                    `-man---pager
95      |-5*[getty]
96      |-snort
97      `-wwwoffled
98 \end{verbatim} %$
99   \caption{L'albero dei processi, così come riportato dal comando
100     \cmd{pstree}.}
101   \label{fig:proc_tree}
102 \end{figure}
103
104 Dato che tutti i processi attivi nel sistema sono comunque generati da
105 \cmd{init} o da uno dei suoi figli\footnote{in realtà questo non è del tutto
106   vero, in Linux ci sono alcuni processi speciali che pur comparendo come
107   figli di \cmd{init}, o con \acr{pid} successivi, sono in realtà generati
108   direttamente dal kernel, (come \cmd{keventd}, \cmd{kswapd}, etc.).} si
109 possono classificare i processi con la relazione padre/figlio in
110 un'organizzazione gerarchica ad albero, in maniera analoga a come i file sono
111 organizzati in un albero di directory (si veda
112 \secref{sec:file_organization}); in \curfig\ si è mostrato il risultato del
113 comando \cmd{pstree} che permette di visualizzare questa struttura, alla cui
114 base c'è \cmd{init} che è progenitore di tutti gli altri processi.
115
116 Il kernel mantiene una tabella dei processi attivi, la cosiddetta
117 \textit{process table}; per ciascun processo viene mantenuta una voce nella
118 tabella dei processi costituita da una struttura \type{task\_struct}, che
119 contiene tutte le informazioni rilevanti per quel processo. Tutte le strutture
120 usate a questo scopo sono dichiarate nell'header file \file{linux/sched.h}, ed
121 uno schema semplificato, che riporta la struttura delle principali informazioni
122 contenute nella \type{task\_struct} (che in seguito incontreremo a più
123 riprese), è mostrato in \nfig.
124
125 \begin{figure}[htb]
126   \centering
127   \includegraphics[width=13cm]{img/task_struct}
128   \caption{Schema semplificato dell'architettura delle strutture usate dal
129     kernel nella gestione dei processi.}
130   \label{fig:proc_task_struct}
131 \end{figure}
132
133
134 Come accennato in \secref{sec:intro_unix_struct} è lo \textit{scheduler} che
135 decide quale processo mettere in esecuzione; esso viene eseguito ad ogni
136 system call ed ad ogni interrupt, (ma può essere anche attivato
137 esplicitamente). Il timer di sistema provvede comunque a che esso sia invocato
138 periodicamente, generando un interrupt periodico secondo la frequenza
139 specificata dalla costante \macro{HZ}, definita in \file{asm/param.h}. Il
140 valore usuale è 100\footnote{è così per tutte le architetture eccetto l'alpha,
141   per la quale è 1000} ed è espresso in Hertz. Si ha cioè un interrupt dal
142 timer ogni centesimo di secondo.
143
144 Ogni volta che viene eseguito, lo \textit{scheduler} effettua il calcolo delle
145 priorità dei vari processi attivi (torneremo su questo in
146 \secref{sec:proc_priority}) e stabilisce quale di essi debba essere posto in
147 esecuzione fino alla successiva invocazione.
148
149
150 \subsection{Una panoramica sulle funzioni fondamentali}
151 \label{sec:proc_handling_intro}
152
153 I processi vengono creati dalla funzione \func{fork}; in molti unix questa è
154 una system call, Linux però usa un'altra nomenclatura, e la funzione
155 \func{fork} è basata a sua volta sulla system call \func{\_\_clone}, che viene
156 usata anche per generare i \textit{thread}.  Il processo figlio creato dalla
157 \func{fork} è una copia identica del processo processo padre, ma ha nuovo
158 \acr{pid} e viene eseguito in maniera indipendente (le differenze fra padre e
159 figlio sono affrontate in dettaglio in \secref{sec:proc_fork}).
160
161 Se si vuole che il processo padre si fermi fino alla conclusione del processo
162 figlio questo deve essere specificato subito dopo la \func{fork} chiamando la
163 funzione \func{wait} o la funzione \func{waitpid} (si veda
164 \secref{sec:proc_wait}); queste funzioni restituiscono anche un'informazione
165 abbastanza limitata sulle cause della terminazione del processo figlio.
166
167 Quando un processo ha concluso il suo compito o ha incontrato un errore non
168 risolvibile esso può essere terminato con la funzione \func{exit} (si veda
169 quanto discusso in \secref{sec:proc_conclusion}). La vita del processo però
170 termina solo quando la notifica della sua conclusione viene ricevuta dal
171 processo padre, a quel punto tutte le risorse allocate nel sistema ad esso
172 associate vengono rilasciate.
173
174 Avere due processi che eseguono esattamente lo stesso codice non è molto
175 utile, normalmente si genera un secondo processo per affidargli l'esecuzione
176 di un compito specifico (ad esempio gestire una connessione dopo che questa è
177 stata stabilita), o fargli eseguire (come fa la shell) un altro programma. Per
178 quest'ultimo caso si usa la seconda funzione fondamentale per programmazione
179 coi processi che è la \func{exec}.
180
181 Il programma che un processo sta eseguendo si chiama immagine del processo (o
182 \textit{process image}), le funzioni della famiglia \func{exec} permettono di
183 caricare un'altro programma da disco sostituendo quest'ultimo all'immagine
184 corrente; questo fa sì che l'immagine precedente venga completamente
185 cancellata. Questo significa che quando il nuovo programma esce, anche il
186 processo termina, e non si può tornare alla precedente immagine.
187
188 Per questo motivo la \func{fork} e la \func{exec} sono funzioni molto
189 particolari con caratteristiche uniche rispetto a tutte le altre, infatti la
190 prima ritorna due volte (nel processo padre e nel figlio) mentre la seconda
191 non ritorna mai (in quanto con essa viene eseguito un altro programma).
192
193
194
195 \section{Le funzioni di base}% della gestione dei processi}
196 \label{sec:proc_handling}
197
198 In questa sezione tratteremo le problematiche della gestione dei processi
199 all'interno del sistema, illustrandone tutti i dettagli.  Inizieremo con le
200 funzioni elementari che permettono di leggerne gli identificatori, per poi
201 passare alla spiegazione delle funzioni base che si usano per la creazione e
202 la terminazione dei processi, e per la messa in esecuzione degli altri
203 programmi.
204
205
206 \subsection{Gli identificatori dei processi}
207 \label{sec:proc_pid}
208
209 Come accennato nell'introduzione, ogni processo viene identificato dal sistema
210 da un numero identificativo unico, il \textit{process id} o \acr{pid};
211 quest'ultimo è un tipo di dato standard, il \type{pid\_t} che in genere è un
212 intero con segno (nel caso di Linux e delle \acr{glibc} il tipo usato è
213 \type{int}).
214
215 Il \acr{pid} viene assegnato in forma progressiva ogni volta che un nuovo
216 processo viene creato, fino ad un limite che, essendo il \acr{pid} un numero
217 positivo memorizzato in un intero a 16 bit, arriva ad un massimo di 32767.
218 Oltre questo valore l'assegnazione riparte dal numero più basso disponibile a
219 partire da un minimo di 300,\footnote{questi valori sono definiti dalla macro
220   \macro{PID\_MAX} in \file{threads.h} e direttamente in \file{fork.c} nei
221   sorgenti del kernel.} che serve a riservare i \acr{pid} più bassi ai processi
222 eseguiti dal direttamente dal kernel.  Per questo motivo, come visto in
223 \secref{sec:proc_hierarchy}, il processo di avvio (\cmd{init}) ha sempre il
224 \acr{pid} uguale a uno.
225
226 Tutti i processi inoltre memorizzano anche il \acr{pid} del genitore da cui
227 sono stati creati, questo viene chiamato in genere \acr{ppid} (da
228 \textit{parent process id}).  Questi due identificativi possono essere
229 ottenuti da programma usando le funzioni:
230 \begin{functions}
231 \headdecl{sys/types.h}
232 \headdecl{unistd.h}
233 \funcdecl{pid\_t getpid(void)} Restituisce il pid del processo corrente.
234 \funcdecl{pid\_t getppid(void)} Restituisce il pid del padre del processo
235     corrente.
236
237 \bodydesc{Entrambe le funzioni non riportano condizioni di errore.}
238 \end{functions}
239 \noindent esempi dell'uso di queste funzioni sono riportati in
240 \figref{fig:proc_fork_code}, nel programma di esempio \file{ForkTest.c}.
241
242 Il fatto che il \acr{pid} sia un numero univoco per il sistema lo rende un
243 candidato per generare ulteriori indicatori associati al processo di cui
244 diventa possibile garantire l'unicità: ad esempio in alcune implementazioni la
245 funzione \func{tmpname} (si veda \secref{sec:file_temp_file}) usa il \acr{pid}
246 per generare un pathname univoco, che non potrà essere replicato da un'altro
247 processo che usi la stessa funzione.
248
249 Tutti i processi figli dello stesso processo padre sono detti
250 \textit{sibling}, questa è una delle relazioni usate nel \textsl{controllo di
251   sessione}, in cui si raggruppano i processi creati su uno stesso terminale,
252 o relativi allo stesso login. Torneremo su questo argomento in dettaglio in
253 \secref{cha:session}, dove esamineremo gli altri identificativi associati ad
254 un processo e le varie relazioni fra processi utilizzate per definire una
255 sessione.
256
257 Oltre al \acr{pid} e al \acr{ppid}, (e a quelli che vedremo in
258 \secref{sec:sess_xxx}, relativi al controllo di sessione), ad ogni processo
259 vengono associati degli altri identificatori che vengono usati per il
260 controllo di accesso.  Questi servono per determinare se un processo può
261 eseguire o meno le operazioni richieste, a seconda dei privilegi e
262 dell'identità di chi lo ha posto in esecuzione; l'argomento è complesso e sarà
263 affrontato in dettaglio in \secref{sec:proc_perms}.
264
265
266 \subsection{La funzione \func{fork}}
267 \label{sec:proc_fork}
268
269 La funzione \func{fork} è la funzione fondamentale della gestione dei
270 processi: come si è detto l'unico modo di creare un nuovo processo è
271 attraverso l'uso di questa funzione, essa quindi riveste un ruolo centrale
272 tutte le volte che si devono scrivere programmi che usano il multitasking.  Il
273 prototipo della funzione è:
274 \begin{functions}
275   \headdecl{sys/types.h} 
276   \headdecl{unistd.h} 
277   \funcdecl{pid\_t fork(void)} 
278   Crea un nuovo processo.
279   
280   \bodydesc{In caso di successo restituisce il \acr{pid} del figlio al padre e
281     zero al figlio; ritorna -1 al padre (senza creare il figlio) in caso di
282     errore; \var{errno} può assumere i valori:
283   \begin{errlist}
284   \item[\macro{EAGAIN}] non ci sono risorse sufficienti per creare un'altro
285     processo (per allocare la tabella delle pagine e le strutture del task) o
286     si è esaurito il numero di processi disponibili.
287   \item[\macro{ENOMEM}] non è stato possibile allocare la memoria per le
288     strutture necessarie al kernel per creare il nuovo processo.
289   \end{errlist}}
290 \end{functions}
291
292 Dopo il successo dell'esecuzione di una \func{fork} sia il processo padre che
293 il processo figlio continuano ad essere eseguiti normalmente all'istruzione
294 seguente la \func{fork}; il processo figlio è però una copia del padre, e
295 riceve una copia dei segmenti di testo, stack e dati (vedi
296 \secref{sec:proc_mem_layout}), ed esegue esattamente lo stesso codice del
297 padre. Si tenga presente però che la memoria è copiata, non condivisa,
298 pertanto padre e figlio vedono variabili diverse.
299
300 Per quanto riguarda la gestione della memoria in generale il segmento di
301 testo, che è identico, è condiviso e tenuto in read-only per il padre e per i
302 figli. Per gli altri segmenti Linux utilizza la tecnica del \textit{copy on
303   write}\index{copy on write}; questa tecnica comporta che una pagina di
304 memoria viene effettivamente copiata per il nuovo processo solo quando ci
305 viene effettuata sopra una scrittura (e si ha quindi una reale differenza fra
306 padre e figlio). In questo modo si rende molto più efficiente il meccanismo
307 della creazione di un nuovo processo, non essendo più necessaria la copia di
308 tutto lo spazio degli indirizzi virtuali del padre, ma solo delle pagine di
309 memoria che sono state modificate, e solo al momento della modifica stessa.
310
311 La differenza che si ha nei due processi è che nel processo padre il valore di
312 ritorno della funzione \func{fork} è il \acr{pid} del processo figlio, mentre
313 nel figlio è zero; in questo modo il programma può identificare se viene
314 eseguito dal padre o dal figlio.  Si noti come la funzione \func{fork} ritorni
315 \textbf{due} volte: una nel padre e una nel figlio. 
316
317 La scelta di questi valori di ritorno non è casuale, un processo infatti può
318 avere più figli, ed il valore di ritorno di \func{fork} è l'unico modo che gli
319 permette di identificare quello appena creato; al contrario un figlio ha
320 sempre un solo padre (il cui \acr{pid} può sempre essere ottenuto con
321 \func{getppid}, vedi \secref{sec:proc_pid}) per cui si usa il valore nullo,
322 che non è il \acr{pid} di nessun processo.
323
324 \begin{figure}[!htb]
325   \footnotesize
326   \begin{lstlisting}{}
327 #include <errno.h>       /* error definitions and routines */ 
328 #include <stdlib.h>      /* C standard library */
329 #include <unistd.h>      /* unix standard library */
330 #include <stdio.h>       /* standard I/O library */
331 #include <string.h>      /* string functions */
332
333 /* Help printing routine */
334 void usage(void);
335
336 int main(int argc, char *argv[])
337 {
338 /* 
339  * Variables definition  
340  */
341     int nchild, i;
342     pid_t pid;
343     int wait_child  = 0;
344     int wait_parent = 0;
345     int wait_end    = 0;
346     ...        /* handling options */
347     nchild = atoi(argv[optind]);
348     printf("Test for forking %d child\n", nchild);
349     /* loop to fork children */
350     for (i=0; i<nchild; i++) {
351         if ( (pid = fork()) < 0) { 
352             /* on error exit */ 
353             printf("Error on %d child creation, %s\n", i+1, strerror(errno));
354             exit(-1); 
355         }
356         if (pid == 0) {   /* child */
357             printf("Child %d successfully executing\n", ++i);
358             if (wait_child) sleep(wait_child);
359             printf("Child %d, parent %d, exiting\n", i, getppid());
360             exit(0);
361         } else {          /* parent */
362             printf("Spawned %d child, pid %d \n", i+1, pid);
363             if (wait_parent) sleep(wait_parent);
364             printf("Go to next child \n");
365         }
366     }
367     /* normal exit */
368     if (wait_end) sleep(wait_end);
369     return 0;
370 }
371   \end{lstlisting}
372   \caption{Esempio di codice per la creazione di nuovi processi.}
373   \label{fig:proc_fork_code}
374 \end{figure}
375
376 Normalmente la chiamata a \func{fork} può fallire solo per due ragioni, o ci
377 sono già troppi processi nel sistema (il che di solito è sintomo che
378 qualcos'altro non sta andando per il verso giusto) o si è ecceduto il limite
379 sul numero totale di processi permessi all'utente (vedi \secref{sec:sys_xxx}).
380
381 L'uso di \func{fork} avviene secondo due modalità principali; la prima è
382 quella in cui all'interno di un programma si creano processi figli cui viene
383 affidata l'esecuzione di una certa sezione di codice, mentre il processo padre
384 ne esegue un'altra. È il caso tipico dei server di rete in cui il padre riceve
385 ed accetta le richieste da parte dei client, per ciascuna delle quali pone in
386 esecuzione un figlio che è incaricato di fornire il servizio.
387
388 La seconda modalità è quella in cui il processo vuole eseguire un altro
389 programma; questo è ad esempio il caso della shell. In questo caso il processo
390 crea un figlio la cui unica operazione è quella fare una \func{exec} (di cui
391 parleremo in \secref{sec:proc_exec}) subito dopo la \func{fork}.
392
393 Alcuni sistemi operativi (il VMS ad esempio) combinano le operazioni di questa
394 seconda modalità (una \func{fork} seguita da una \func{exec}) in un'unica
395 operazione che viene chiamata \textit{spawn}. Nei sistemi unix-like è stato
396 scelto di mantenere questa separazione, dato che, come per la prima modalità
397 d'uso, esistono numerosi scenari in cui si può usare una \func{fork} senza
398 aver bisogno di eseguire una \func{exec}. Inoltre, anche nel caso della
399 seconda modalità d'uso, avere le due funzioni separate permette al figlio di
400 cambiare gli attributi del processo (maschera dei segnali, redirezione
401 dell'output, \textit{user id}) prima della \func{exec}, rendendo così
402 relativamente facile intervenire sulle le modalità di esecuzione del nuovo
403 programma.
404
405 In \curfig\ si è riportato il corpo del codice del programma di esempio
406 \cmd{forktest}, che ci permette di illustrare molte caratteristiche dell'uso
407 della funzione \func{fork}. Il programma permette di creare un numero di figli
408 specificato da linea di comando, e prende anche alcune opzioni per indicare
409 degli eventuali tempi di attesa in secondi (eseguiti tramite la funzione
410 \func{sleep}) per il padre ed il figlio (con \cmd{forktest -h} si ottiene la
411 descrizione delle opzioni); il codice completo, compresa la parte che gestisce
412 le opzioni a riga di comando, è disponibile nel file \file{ForkTest.c},
413 distribuito insieme agli altri sorgenti degli esempi su
414 \href{http://firenze.linux.it/~piccardi/gapil_source.tgz}
415 {\texttt{http://firenze.linux.it/\~~\hspace{-2.0mm}piccardi/gapil\_source.tgz}}.
416
417 Decifrato il numero di figli da creare, il ciclo principale del programma
418 (\texttt{\small 24--40}) esegue in successione la creazione dei processi figli
419 controllando il successo della chiamata a \func{fork} (\texttt{\small
420   25--29}); ciascun figlio (\texttt{\small 31--34}) si limita a stampare il
421 suo numero di successione, eventualmente attendere il numero di secondi
422 specificato e scrivere un messaggio prima di uscire. Il processo padre invece
423 (\texttt{\small 36--38}) stampa un messaggio di creazione, eventualmente
424 attende il numero di secondi specificato, e procede nell'esecuzione del ciclo;
425 alla conclusione del ciclo, prima di uscire, può essere specificato un altro
426 periodo di attesa.
427
428 Se eseguiamo il comando senza specificare attese (come si può notare in
429 \texttt{\small 17--19} i valori di default specificano di non attendere),
430 otterremo come output sul terminale:
431
432 \footnotesize
433 \begin{verbatim}
434 [piccardi@selidor sources]$ ./forktest 3
435 Process 1963: forking 3 child
436 Spawned 1 child, pid 1964 
437 Child 1 successfully executing
438 Child 1, parent 1963, exiting
439 Go to next child 
440 Spawned 2 child, pid 1965 
441 Child 2 successfully executing
442 Child 2, parent 1963, exiting
443 Go to next child 
444 Child 3 successfully executing
445 Child 3, parent 1963, exiting
446 Spawned 3 child, pid 1966 
447 Go to next child 
448 \end{verbatim} %$
449 \normalsize
450
451 Esaminiamo questo risultato: una prima conclusione che si può trarre è che non
452 si può dire quale processo fra il padre ed il figlio venga eseguito per
453 primo\footnote{a partire dal kernel 2.5.2-pre10 è stato introdotto il nuovo
454   scheduler di Ingo Molnar che esegue sempre per primo il figlio; per
455   mantenere la portabilità è opportuno non fare comunque affidamento su questo
456   comportamento.} dopo la chiamata a \func{fork}; dall'esempio si può notare
457 infatti come nei primi due cicli sia stato eseguito per primo il padre (con la
458 stampa del \acr{pid} del nuovo processo) per poi passare all'esecuzione del
459 figlio (completata con i due avvisi di esecuzione ed uscita), e tornare
460 all'esecuzione del padre (con la stampa del passaggio al ciclo successivo),
461 mentre la terza volta è stato prima eseguito il figlio (fino alla conclusione)
462 e poi il padre.
463
464 In generale l'ordine di esecuzione dipenderà, oltre che dall'algoritmo di
465 scheduling usato dal kernel, dalla particolare situazione in si trova la
466 macchina al momento della chiamata, risultando del tutto impredicibile.
467 Eseguendo più volte il programma di prova e producendo un numero diverso di
468 figli, si sono ottenute situazioni completamente diverse, compreso il caso in
469 cui il processo padre ha eseguito più di una \func{fork} prima che uno dei
470 figli venisse messo in esecuzione.
471
472 Pertanto non si può fare nessuna assunzione sulla sequenza di esecuzione delle
473 istruzioni del codice fra padre e figli, né sull'ordine in cui questi potranno
474 essere messi in esecuzione. Se è necessaria una qualche forma di precedenza
475 occorrerà provvedere ad espliciti meccanismi di sincronizzazione, pena il
476 rischio di incorrere nelle cosiddette \textit{race condition} \index{race
477   condition} (vedi \secref{sec:proc_race_cond}.
478
479 Si noti inoltre che essendo i segmenti di memoria utilizzati dai singoli
480 processi completamente separati, le modifiche delle variabili nei processi
481 figli (come l'incremento di \var{i} in \texttt{\small 31}) sono visibili solo
482 a loro (ogni processo vede solo la propria copia della memoria), e non hanno
483 alcun effetto sul valore che le stesse variabili hanno nel processo padre (ed
484 in eventuali altri processi figli che eseguano lo stesso codice).
485
486 Un secondo aspetto molto importante nella creazione dei processi figli è
487 quello dell'interazione dei vari processi con i file; per illustrarlo meglio
488 proviamo a redirigere su un file l'output del nostro programma di test, quello
489 che otterremo è:
490
491 \footnotesize
492 \begin{verbatim}
493 [piccardi@selidor sources]$ ./forktest 3 > output
494 [piccardi@selidor sources]$ cat output
495 Process 1967: forking 3 child
496 Child 1 successfully executing
497 Child 1, parent 1967, exiting
498 Test for forking 3 child
499 Spawned 1 child, pid 1968 
500 Go to next child 
501 Child 2 successfully executing
502 Child 2, parent 1967, exiting
503 Test for forking 3 child
504 Spawned 1 child, pid 1968 
505 Go to next child 
506 Spawned 2 child, pid 1969 
507 Go to next child 
508 Child 3 successfully executing
509 Child 3, parent 1967, exiting
510 Test for forking 3 child
511 Spawned 1 child, pid 1968 
512 Go to next child 
513 Spawned 2 child, pid 1969 
514 Go to next child 
515 Spawned 3 child, pid 1970 
516 Go to next child 
517 \end{verbatim}
518 \normalsize
519 che come si vede è completamente diverso da quanto ottenevamo sul terminale.
520
521 Il comportamento delle varie funzioni di interfaccia con i file è analizzato
522 in gran dettaglio in \capref{cha:file_unix_interface} e in
523 \secref{cha:files_std_interface}. Qui basta accennare che si sono usate le
524 funzioni standard della libreria del C che prevedono l'output bufferizzato; e
525 questa bufferizzazione (trattata in dettaglio in \secref{sec:file_buffering})
526 varia a seconda che si tratti di un file su disco (in cui il buffer viene
527 scaricato su disco solo quando necessario) o di un terminale (nel qual caso il
528 buffer viene scaricato ad ogni carattere di a capo).
529
530 Nel primo esempio allora avevamo che ad ogni chiamata a \func{printf} il
531 buffer veniva scaricato, e le singole righe erano stampate a video subito dopo
532 l'esecuzione della \func{printf}. Ma con la redirezione su file la scrittura
533 non avviene più alla fine di ogni riga e l'output resta nel buffer. Dato che
534 ogni figlio riceve una copia della memoria del padre, esso riceverà anche
535 quanto c'è nel buffer delle funzioni di I/O, comprese le linee scritte dal
536 padre fino allora. Così quando il buffer viene scritto su disco all'uscita del
537 figlio, troveremo nel file anche tutto quello che il processo padre aveva
538 scritto prima della sua creazione.  E alla fine del file (dato che in questo
539 caso il padre esce per ultimo) troveremo anche l'output completo del padre.
540
541 L'esempio ci mostra un'altro aspetto fondamentale dell'interazione con i file,
542 valido anche per l'esempio precedente, ma meno evidente: il fatto cioè che non
543 solo processi diversi possono scrivere in contemporanea sullo stesso file
544 (l'argomento della condivisione dei file è trattato in dettaglio in
545 \secref{sec:file_sharing}), ma anche che, a differenza di quanto avviene per
546 le variabili, la posizione corrente sul file è condivisa fra il padre e tutti
547 i processi figli.
548
549 Quello che succede è che quando lo standard output del padre viene rediretto,
550 lo stesso avviene anche per tutti i figli; la funzione \func{fork} infatti ha
551 la caratteristica di duplicare (allo stesso modo in cui lo fa la funzione
552 \func{dup}, trattata in \secref{sec:file_dup}) nei figli tutti i file
553 descriptor aperti nel padre, il che comporta che padre e figli condividono le
554 stesse voci della \textit{file table} (per la spiegazione di questi termini si
555 veda \secref{sec:file_sharing}) e fra cui c'è anche la posizione corrente nel
556 file.
557
558 In questo modo se un processo scrive sul file aggiornerà la posizione corrente
559 sulla \textit{file table}, e tutti gli altri processi, che vedono la stessa
560 \textit{file table}, vedranno il nuovo valore. In questo modo si evita, in
561 casi come quello appena mostrato in cui diversi processi scrivono sullo stesso
562 file, che l'output successivo di un processo vada a sovrapporsi a quello dei
563 precedenti: l'output potrà risultare mescolato, ma non ci saranno parti
564 perdute per via di una sovrascrittura.
565
566 Questo tipo di comportamento è essenziale in tutti quei casi in cui il padre
567 crea un figlio e attende la sua conclusione per proseguire, ed entrambi
568 scrivono sullo stesso file (un caso tipico è la shell quando lancia un
569 programma, il cui output va sullo standard output). 
570
571 In questo modo, anche se l'output viene rediretto, il padre potrà sempre
572 continuare a scrivere in coda a quanto scritto dal figlio in maniera
573 automatica; se così non fosse ottenere questo comportamento sarebbe
574 estremamente complesso necessitando di una qualche forma di comunicazione fra
575 i due processi per far riprendere al padre la scrittura al punto giusto.
576
577 In generale comunque non è buona norma far scrivere più processi sullo stesso
578 file senza una qualche forma di sincronizzazione in quanto, come visto anche
579 con il nostro esempio, le varie scritture risulteranno mescolate fra loro in
580 una sequenza impredicibile. Per questo le modalità con cui in genere si usano
581 i file dopo una \func{fork} sono sostanzialmente due:
582 \begin{enumerate}
583 \item Il processo padre aspetta la conclusione del figlio. In questo caso non
584   è necessaria nessuna azione riguardo ai file, in quanto la sincronizzazione
585   della posizione corrente dopo eventuali operazioni di lettura e scrittura
586   effettuate dal figlio è automatica.
587 \item L'esecuzione di padre e figlio procede indipendentemente. In questo caso
588   ciascuno dei due processi deve chiudere i file che non gli servono una volta
589   che la \func{fork} è stata eseguita, per evitare ogni forma di interferenza.
590 \end{enumerate}
591
592 Oltre ai file aperti i processi figli ereditano dal padre una serie di altre
593 proprietà; la lista dettagliata delle proprietà che padre e figlio hanno in
594 comune dopo l'esecuzione di una \func{fork} è la seguente:
595 \begin{itemize*}
596 \item i file aperti e gli eventuali flag di \textit{close-on-exec} settati
597   (vedi \secref{sec:proc_exec} e \secref{sec:file_fcntl}).
598 \item gli identificatori per il controllo di accesso: il \textit{real user
599     id}, il \textit{real group id}, l'\textit{effective user id},
600   l'\textit{effective group id} ed i \textit{supplementary group id} (vedi
601   \secref{sec:proc_access_id}).
602 \item gli identificatori per il controllo di sessione: il \textit{process
603     group id} e il \textit{session id} ed il terminale di controllo (vedi
604   \secref{sec:sess_xxx} e \secref{sec:sess_xxx}).
605 \item la directory di lavoro e la directory radice (vedi
606   \secref{sec:file_work_dir} e \secref{sec:file_chroot}).
607 \item la maschera dei permessi di creazione (vedi \secref{sec:file_umask}).
608 \item la maschera dei segnali bloccati (vedi \secref{sec:sig_sigpending}) e le
609   azioni installate (vedi \secref{sec:sig_gen_beha}).
610 \item i segmenti di memoria condivisa agganciati al processo (vedi
611 \secref{sec:ipc_xxx}). 
612 \item i limiti sulle risorse (vedi \secref{sec:sys_xxx}).
613 \item le variabili di ambiente (vedi \secref{sec:proc_environ}).
614 \end{itemize*}
615 le differenze fra padre e figlio dopo la \func{fork} invece sono:
616 \begin{itemize*}
617 \item il valore di ritorno di \func{fork}.
618 \item il \textit{process id}. 
619 \item il \textit{parent process id} (quello del figlio viene settato al
620   \acr{pid} del padre).
621 \item i valori dei tempi di esecuzione (vedi \secref{sec:sys_xxx}) che
622   nel figlio sono posti a zero.
623 \item i \textit{file lock} (vedi \secref{sec:file_locking}), che non
624   vengono ereditati dal figlio.
625 \item gli allarmi ed i segnali pendenti (vedi \secref{sec:sig_gen_beha}), che
626   per il figlio vengono cancellati.
627 \end{itemize*}
628
629
630 \subsection{La funzione \func{vfork}}
631 \label{sec:proc_vfork}
632
633 La funzione \func{vfork} è esattamente identica a \func{fork} ed ha la stessa
634 semantica e gli stessi errori; la sola differenza è che non viene creata la
635 tabella delle pagine né la struttura dei task per il nuovo processo. Il
636 processo padre è posto in attesa fintanto che il figlio non ha eseguito una
637 \func{execve} o non è uscito con una \func{\_exit}. Il figlio condivide la
638 memoria del padre (e modifiche possono avere effetti imprevedibili) e non deve
639 ritornare o uscire con \func{exit} ma usare esplicitamente \func{\_exit}.
640
641 Questa funzione è un rimasuglio dei vecchi tempi in cui eseguire una
642 \func{fork} comportava anche la copia completa del segmento dati del processo
643 padre, che costituiva un inutile appesantimento in tutti quei casi in cui la
644 \func{fork} veniva fatta solo per poi eseguire una \func{exec}. La funzione
645 venne introdotta in BSD per migliorare le prestazioni.
646
647 Dato che Linux supporta il \textit{copy on write} la perdita di prestazioni è
648 assolutamente trascurabile, e l'uso di questa funzione (che resta un caso
649 speciale della funzione \func{clone}), è deprecato; per questo eviteremo di
650 trattarla ulteriormente.
651
652
653 \subsection{La conclusione di un processo.}
654 \label{sec:proc_termination}
655
656 In \secref{sec:proc_conclusion} abbiamo già affrontato le modalità con cui
657 chiudere un programma, ma dall'interno del programma stesso; avendo a che fare
658 con un sistema multitasking resta da affrontare l'argomento dal punto di vista
659 di come il sistema gestisce la conclusione dei processi.
660
661 Abbiamo visto in \secref{sec:proc_conclusion} le tre modalità con cui un
662 programma viene terminato in maniera normale: la chiamata di \func{exit} (che
663 esegue le funzioni registrate per l'uscita e chiude gli stream), il ritorno
664 dalla funzione \func{main} (equivalente alla chiamata di \func{exit}), e la
665 chiamata ad \func{\_exit} (che passa direttamente alle operazioni di
666 terminazione del processo da parte del kernel).
667
668 Ma abbiamo accennato che oltre alla conclusione normale esistono anche delle
669 modalità di conclusione anomala; queste sono in sostanza due: il programma può
670 chiamare la funzione \func{abort} per invocare una chiusura anomala, o essere
671 terminato da un segnale.  In realtà anche la prima modalità si riconduce alla
672 seconda, dato che \func{abort} si limita a generare il segnale
673 \macro{SIGABRT}.
674
675 Qualunque sia la modalità di conclusione di un processo, il kernel esegue
676 comunque una serie di operazioni: chiude tutti i file aperti, rilascia la
677 memoria che stava usando, e così via; l'elenco completo delle operazioni
678 eseguite alla chiusura di un processo è il seguente:
679 \begin{itemize*}
680 \item tutti i file descriptor sono chiusi.
681 \item viene memorizzato lo stato di terminazione del processo.
682 \item ad ogni processo figlio viene assegnato un nuovo padre (in genere
683   \cmd{init}).
684 \item viene inviato il segnale \macro{SIGCHLD} al processo padre (vedi
685   \secref{sec:sig_sigchld}).
686 \item se il processo è un leader di sessione viene mandato un segnale di
687   \macro{SIGHUP} a tutti i processi in background e il terminale di
688   controllo viene disconnesso (vedi \secref{sec:sess_xxx}).
689 \item se la conclusione di un processo rende orfano un \textit{process
690     group} ciascun membro del gruppo viene bloccato, e poi gli vengono
691   inviati in successione i segnali \macro{SIGHUP} e \macro{SIGCONT}
692   (vedi \secref{sec:sess_xxx}).
693 \end{itemize*}
694
695 Oltre queste operazioni è però necessario poter disporre di un meccanismo
696 ulteriore che consenta di sapere come la terminazione è avvenuta: dato che in
697 un sistema unix-like tutto viene gestito attraverso i processi, il meccanismo
698 scelto consiste nel riportare lo stato di terminazione (il cosiddetto
699 \textit{termination status}) al processo padre.
700
701 Nel caso di conclusione normale, abbiamo visto in \secref{sec:proc_conclusion}
702 che lo stato di uscita del processo viene caratterizzato tramite il valore del
703 cosiddetto \textit{exit status}, cioè il valore passato alle funzioni
704 \func{exit} o \func{\_exit} (o dal valore di ritorno per \func{main}).  Ma se
705 il processo viene concluso in maniera anomala il programma non può specificare
706 nessun \textit{exit status}, ed è il kernel che deve generare autonomamente il
707 \textit{termination status} per indicare le ragioni della conclusione anomala.
708
709 Si noti la distinzione fra \textit{exit status} e \textit{termination status}:
710 quello che contraddistingue lo stato di chiusura del processo e viene
711 riportato attraverso le funzioni \func{wait} o \func{waitpid} (vedi
712 \secref{sec:proc_wait}) è sempre quest'ultimo; in caso di conclusione normale
713 il kernel usa il primo (nel codice eseguito da \func{\_exit}) per produrre il
714 secondo.
715
716 La scelta di riportare al padre lo stato di terminazione dei figli, pur
717 essendo l'unica possibile, comporta comunque alcune complicazioni: infatti se
718 alla sua creazione è scontato che ogni nuovo processo ha un padre, non è detto
719 che sia così alla sua conclusione, dato che il padre potrebbe essere già
720 terminato (si potrebbe avere cioè quello che si chiama un processo
721 \textsl{orfano}). 
722
723 Questa complicazione viene superata facendo in modo che il processo orfano
724 venga \textsl{adottato} da \cmd{init}. Come già accennato quando un processo
725 termina, il kernel controlla se è il padre di altri processi in esecuzione: in
726 caso positivo allora il \acr{ppid} di tutti questi processi viene sostituito
727 con il \acr{pid} di \cmd{init} (e cioè con 1); in questo modo ogni processo
728 avrà sempre un padre (nel caso possiamo parlare di un padre \textsl{adottivo})
729 cui riportare il suo stato di terminazione.  Come verifica di questo
730 comportamento possiamo eseguire il nostro programma \cmd{forktest} imponendo a
731 ciascun processo figlio due secondi di attesa prima di uscire, il risultato è:
732
733 \footnotesize
734 \begin{verbatim}
735 [piccardi@selidor sources]$ ./forktest -c2 3
736 Process 1972: forking 3 child
737 Spawned 1 child, pid 1973 
738 Child 1 successfully executing
739 Go to next child 
740 Spawned 2 child, pid 1974 
741 Child 2 successfully executing
742 Go to next child 
743 Child 3 successfully executing
744 Spawned 3 child, pid 1975 
745 Go to next child 
746 [piccardi@selidor sources]$ Child 3, parent 1, exiting
747 Child 2, parent 1, exiting
748 Child 1, parent 1, exiting
749 \end{verbatim}
750 \normalsize
751 come si può notare in questo caso il processo padre si conclude prima dei
752 figli, tornando alla shell, che stampa il prompt sul terminale: circa due
753 secondi dopo viene stampato a video anche l'output dei tre figli che
754 terminano, e come si può notare in questo caso, al contrario di quanto visto
755 in precedenza, essi riportano 1 come \acr{ppid}.
756
757 Altrettanto rilevante è il caso in cui il figlio termina prima del padre,
758 perché non è detto che il padre possa ricevere immediatamente lo stato di
759 terminazione, quindi il kernel deve comunque conservare una certa quantità di
760 informazioni riguardo ai processi che sta terminando.
761
762 Questo viene fatto mantenendo attiva la voce nella tabella dei processi, e
763 memorizzando alcuni dati essenziali, come il \acr{pid}, i tempi di CPU usati
764 dal processo (vedi \secref{sec:sys_unix_time}) e lo stato di
765 terminazione\footnote{NdA verificare esattamente cosa c'è!}, mentre la memoria
766 in uso ed i file aperti vengono rilasciati immediatamente. I processi che sono
767 terminati, ma il cui stato di terminazione non è stato ancora ricevuto dal
768 padre sono chiamati \textit{zombie}, essi restano presenti nella tabella dei
769 processi ed in genere possono essere identificati dall'output di \cmd{ps} per
770 la presenza di una \texttt{Z} nella colonna che ne indica lo stato. Quando il
771 padre effettuerà la lettura dello stato di uscita anche questa informazione,
772 non più necessaria, verrà scartata e la terminazione potrà dirsi completamente
773 conclusa.
774
775 Possiamo utilizzare il nostro programma di prova per analizzare anche questa
776 condizione: lanciamo il comando \cmd{forktest} in background, indicando al
777 processo padre di aspettare 10 secondi prima di uscire; in questo caso, usando
778 \cmd{ps} sullo stesso terminale (prima dello scadere dei 10 secondi)
779 otterremo:
780
781 \footnotesize
782 \begin{verbatim}
783 [piccardi@selidor sources]$ ps T
784   PID TTY      STAT   TIME COMMAND
785   419 pts/0    S      0:00 bash
786   568 pts/0    S      0:00 ./forktest -e10 3
787   569 pts/0    Z      0:00 [forktest <defunct>]
788   570 pts/0    Z      0:00 [forktest <defunct>]
789   571 pts/0    Z      0:00 [forktest <defunct>]
790   572 pts/0    R      0:00 ps T
791 \end{verbatim} %$
792 \normalsize 
793 e come si vede, dato che non si è fatto nulla per riceverne lo stato di
794 terminazione, i tre processi figli sono ancora presenti pur essendosi
795 conclusi, con lo stato di zombie e l'indicazione che sono stati terminati.
796
797 La possibilità di avere degli zombie deve essere tenuta sempre presente quando
798 si scrive un programma che deve essere mantenuto in esecuzione a lungo e
799 creare molti figli. In questo caso si deve sempre avere cura di far leggere
800 l'eventuale stato di uscita di tutti i figli (in genere questo si fa
801 attraverso un apposito \textit{signal handler}, che chiama la funzione
802 \func{wait}, vedi \secref{sec:sig_sigchld} e \secref{sec:proc_wait}). Questa
803 operazione è necessaria perché anche se gli \textit{zombie} non consumano
804 risorse di memoria o processore, occupano comunque una voce nella tabella dei
805 processi, che a lungo andare potrebbe esaurirsi.
806
807 Si noti che quando un processo adottato da \cmd{init} termina, esso non
808 diviene uno \textit{zombie}; questo perché una delle funzioni di \cmd{init} è
809 appunto quella di chiamare la funzione \func{wait} per i processi cui fa da
810 padre, completandone la terminazione. Questo è quanto avviene anche quando,
811 come nel caso del precedente esempio con \cmd{forktest}, il padre termina con
812 dei figli in stato di zombie: alla sua terminazione infatti tutti i suoi figli
813 (compresi gli zombie) verranno adottati da \cmd{init}, il quale provvederà a
814 completarne la terminazione.
815
816 Si tenga presente infine che siccome gli zombie sono processi già usciti, non
817 c'è modo di eliminarli con il comando \cmd{kill}; l'unica possibilità di
818 cancellarli dalla tabella dei processi è quella di terminare il processo che
819 li ha generati, in modo che \cmd{init} possa adottarli e provvedere a
820 concluderne la terminazione.
821
822
823 \subsection{Le funzioni \func{wait} e  \func{waitpid}}
824 \label{sec:proc_wait}
825
826 Uno degli usi più comuni delle capacità multitasking di un sistema unix-like
827 consiste nella creazione di programmi di tipo server, in cui un processo
828 principale attende le richieste che vengono poi soddisfatte da una serie di
829 processi figli. Si è già sottolineato al paragrafo precedente come in questo
830 caso diventi necessario gestire esplicitamente la conclusione dei figli onde
831 evitare di riempire di \textit{zombie} la tabella dei processi; le funzioni
832 deputate a questo compito sono sostanzialmente due, \func{wait} e
833 \func{waitpid}. La prima, il cui prototipo è:
834 \begin{functions}
835 \headdecl{sys/types.h}
836 \headdecl{sys/wait.h}
837 \funcdecl{pid\_t wait(int *status)} 
838
839 Sospende il processo corrente finché un figlio non è uscito, o finché un
840 segnale termina il processo o chiama una funzione di gestione. 
841
842 \bodydesc{La funzione restituisce il \acr{pid} del figlio in caso di successo
843   e -1 in caso di errore; \var{errno} può assumere i valori:
844   \begin{errlist}
845   \item[\macro{EINTR}] la funzione è stata interrotta da un segnale.
846   \end{errlist}}
847 \end{functions}
848 \noindent
849 è presente fin dalle prime versioni di Unix; la funzione ritorna non appena un
850 processo figlio termina. Se un figlio è già terminato la funzione ritorna
851 immediatamente.
852
853 Al ritorno lo stato di terminazione del processo viene salvato nella
854 variabile puntata da \var{status} e tutte le informazioni relative al
855 processo (vedi \secref{sec:proc_termination}) vengono rilasciate.  Nel
856 caso un processo abbia più figli il valore di ritorno permette di
857 identificare qual'è quello che è uscito.
858
859 Questa funzione ha il difetto di essere poco flessibile, in quanto
860 ritorna all'uscita di un figlio qualunque. Nelle occasioni in cui è
861 necessario attendere la conclusione di un processo specifico occorre
862 predisporre un meccanismo che tenga conto dei processi già terminati, e
863 provveda a ripetere la chiamata alla funzione nel caso il processo
864 cercato sia ancora attivo.
865
866 Per questo motivo lo standard POSIX.1 ha introdotto la funzione \func{waitpid}
867 che effettua lo stesso servizio, ma dispone di una serie di funzionalità più
868 ampie, legate anche al controllo di sessione.  Dato che è possibile ottenere
869 lo stesso comportamento di \func{wait} si consiglia di utilizzare sempre
870 questa funzione, il cui prototipo è:
871 \begin{functions}
872 \headdecl{sys/types.h}
873 \headdecl{sys/wait.h}
874 \funcdecl{pid\_t waitpid(pid\_t pid, int *status, int options)} 
875 Attende la conclusione di un processo figlio.
876
877 \bodydesc{La funzione restituisce il \acr{pid} del processo che è uscito, 0 se
878   è stata specificata l'opzione \macro{WNOHANG} e il processo non è uscito e
879   -1 per un errore, nel qual caso \var{errno} assumerà i valori:
880   \begin{errlist}
881   \item[\macro{EINTR}] se non è stata specificata l'opzione \macro{WNOHANG} e
882     la funzione è stata interrotta da un segnale.
883   \item[\macro{ECHILD}] il processo specificato da \param{pid} non esiste o
884     non è figlio del processo chiamante.
885   \end{errlist}}
886 \end{functions}
887
888 Le differenze principali fra le due funzioni sono che \func{wait} si blocca
889 sempre fino a che un processo figlio non termina, mentre \func{waitpid} ha la
890 possibilità si specificare un'opzione \macro{WNOHANG} che ne previene il
891 blocco; inoltre \func{waitpid} può specificare quale processo attendere sulla
892 base del valore fornito dall'argomento \param{pid}, secondo lo
893 specchietto riportato in \ntab:
894 \begin{table}[!htb]
895   \centering
896   \footnotesize
897   \begin{tabular}[c]{|c|c|p{8cm}|}
898     \hline
899     \textbf{Valore} & \textbf{Macro} &\textbf{Significato}\\
900     \hline
901     \hline
902     $<-1$& -- & attende per un figlio il cui \textit{process group} è uguale al
903     valore assoluto di \var{pid}. \\
904     $-1$ & \macro{WAIT\_ANY} & attende per un figlio qualsiasi, usata in
905     questa maniera è equivalente a \func{wait}.\\ 
906     $0$  & \macro{WAIT\_MYPGRP} & attende per un figlio il cui \textit{process
907     group} è uguale a quello del processo chiamante. \\
908     $>0$ & -- &attende per un figlio il cui \acr{pid} è uguale al
909     valore di \var{pid}.\\
910     \hline
911   \end{tabular}
912   \caption{Significato dei valori del parametro \var{pid} della funzione
913     \func{waitpid}.}
914   \label{tab:proc_waidpid_pid}
915 \end{table}
916
917 Il comportamento di \func{waitpid} può inoltre essere modificato passando
918 delle opportune opzioni tramite l'argomento \param{option}. I valori possibili
919 sono il già citato \macro{WNOHANG}, che previene il blocco della funzione
920 quando il processo figlio non è terminato, e \macro{WUNTRACED} (usata per il
921 controllo di sessione, trattato in \capref{cha:session}) che fa ritornare la
922 funzione anche per i processi figli che sono bloccati ed il cui stato non è
923 stato ancora riportato al padre. Il valore dell'opzione deve essere
924 specificato come maschera binaria ottenuta con l'OR delle suddette costanti
925 con zero.
926
927 La terminazione di un processo figlio è chiaramente un evento asincrono
928 rispetto all'esecuzione di un programma e può avvenire in un qualunque
929 momento. Per questo motivo, come accennato nella sezione precedente, una delle
930 azioni prese dal kernel alla conclusione di un processo è quella di mandare un
931 segnale di \macro{SIGCHLD} al padre. L'azione di default (si veda
932 \secref{sec:sig_base}) per questo segnale è di essere ignorato, ma la sua
933 generazione costituisce il meccanismo di comunicazione asincrona con cui il
934 kernel avverte il processo padre che uno dei suoi figli è terminato.
935
936 In genere in un programma non si vuole essere forzati ad attendere la
937 conclusione di un processo per proseguire, specie se tutto questo serve solo
938 per leggerne lo stato di chiusura (ed evitare la presenza di \textit{zombie}),
939 per questo la modalità più usata per chiamare queste funzioni è quella di
940 utilizzarle all'interno di un \textit{signal handler} (torneremo sui segnali e
941 su come gestire \macro{SIGCHLD} in \secref{sec:sig_sigwait_xxx}). In questo
942 caso infatti, dato che il segnale è generato dalla terminazione di un figlio,
943 avremo la certezza che la chiamata a \func{wait} non si bloccherà.
944
945 \begin{table}[!htb]
946   \centering
947   \footnotesize
948   \begin{tabular}[c]{|c|p{10cm}|}
949     \hline
950     \textbf{Macro} & \textbf{Descrizione}\\
951     \hline
952     \hline
953     \macro{WIFEXITED(s)}   & Condizione vera (valore non nullo) per un processo
954     figlio che sia terminato normalmente. \\
955     \macro{WEXITSTATUS(s)} & Restituisce gli otto bit meno significativi dello
956     stato di uscita del processo (passato attraverso \func{\_exit}, \func{exit}
957     o come valore di ritorno di \func{main}). Può essere valutata solo se
958     \macro{WIFEXITED} ha restituito un valore non nullo.\\
959     \macro{WIFSIGNALED(s)} & Vera se il processo figlio è terminato
960     in maniera anomala a causa di un segnale che non è stato catturato (vedi
961     \secref{sec:sig_notification}).\\
962     \macro{WTERMSIG(s)}    & restituisce il numero del segnale che ha causato
963     la terminazione anomala del processo.  Può essere valutata solo se
964     \macro{WIFSIGNALED} ha restituito un valore non nullo.\\
965     \macro{WCOREDUMP(s)}   & Vera se il processo terminato ha generato un
966     file si \textit{core dump}. Può essere valutata solo se
967     \macro{WIFSIGNALED} ha restituito un valore non nullo.\footnote{questa
968     macro non è definita dallo standard POSIX.1, ma è presente come estensione
969     sia in Linux che in altri Unix.}\\
970     \macro{WIFSTOPPED(s)}  & Vera se il processo che ha causato il ritorno di
971     \func{waitpid} è bloccato. L'uso è possibile solo avendo specificato
972     l'opzione \macro{WUNTRACED}. \\
973     \macro{WSTOPSIG(s)}    & restituisce il numero del segnale che ha bloccato
974     il processo, Può essere valutata solo se \macro{WIFSTOPPED} ha
975     restituito un valore non nullo. \\
976     \hline
977   \end{tabular}
978   \caption{Descrizione delle varie macro di preprocessore utilizzabili per 
979     verificare lo stato di terminazione \var{s} di un processo.}
980   \label{tab:proc_status_macro}
981 \end{table}
982
983 Entrambe le funzioni di attesa restituiscono lo stato di terminazione del
984 processo tramite il puntatore \param{status} (se non interessa memorizzare lo
985 stato si può passare un puntatore nullo). Il valore restituito da entrambe le
986 funzioni dipende dall'implementazione, e tradizionalmente alcuni bit (in
987 genere 8) sono riservati per memorizzare lo stato di uscita, e altri per
988 indicare il segnale che ha causato la terminazione (in caso di conclusione
989 anomala), uno per indicare se è stato generato un core file, ecc.\footnote{le
990   definizioni esatte si possono trovare in \file{<bits/waitstatus.h>} ma
991   questo file non deve mai essere usato direttamente, esso viene incluso
992   attraverso \file{<sys/wait.h>}.}
993
994 Lo standard POSIX.1 definisce una serie di macro di preprocessore da usare per
995 analizzare lo stato di uscita. Esse sono definite sempre in
996 \file{<sys/wait.h>} ed elencate in \tabref{tab:proc_status_macro} (si tenga
997 presente che queste macro prendono come parametro la variabile di tipo
998 \type{int} puntata da \var{status}).
999
1000 Si tenga conto che nel caso di conclusione anomala il valore restituito da
1001 \macro{WTERMSIG} può essere confrontato con le costanti definite in
1002 \file{signal.h} ed elencate in \tabref{tab:sig_signal_list}, e stampato usando
1003 le apposite funzioni trattate in \secref{sec:sig_strsignal}.
1004
1005
1006 \subsection{Le funzioni \func{wait3} e \func{wait4}}
1007 \label{sec:proc_wait4}
1008
1009 Linux, seguendo un'estensione di BSD, supporta altre due funzioni per la
1010 lettura dello stato di terminazione di un processo \func{wait3} e
1011 \func{wait4}, analoghe alle precedenti ma che prevedono un ulteriore
1012 parametro attraverso il quale il kernel può restituire al padre informazioni
1013 sulle risorse usate dal processo terminato e dai vari figli.  I prototipi di
1014 queste funzioni, che diventano accessibili definendo la costante
1015 \macro{\_USE\_BSD}, sono:
1016 \begin{functions}
1017   \headdecl{sys/times.h} 
1018   \headdecl{sys/types.h} 
1019   \headdecl{sys/wait.h}        
1020   \headdecl{sys/resource.h}
1021   \funcdecl{pid\_t wait4(pid\_t pid, int * status, int options, struct rusage
1022     * rusage)} 
1023   È identica a \func{waitpid} sia per comportamento che per i
1024   valori dei parametri, ma restituisce in \param{rusage} un sommario delle
1025   risorse usate dal processo (per i dettagli vedi \secref{sec:sys_xxx})
1026
1027   \funcdecl{pid\_t wait3(int *status, int options, struct rusage *rusage)}
1028   Prima versione, equivalente a \code{wait4(-1, \&status, opt, rusage)} è
1029   ormai deprecata in favore di \func{wait4}.
1030 \end{functions}
1031 \noindent 
1032 la struttura \type{rusage} è definita in \file{sys/resource.h}, e viene
1033 utilizzata anche dalla funzione \func{getrusage} (vedi \secref{sec:sys_xxx})
1034 per ottenere le risorse di sistema usate da un processo; la sua definizione è
1035 riportata in \figref{fig:sys_rusage_struct}.
1036
1037 In genere includere esplicitamente \file{<sys/time.h>} non è più
1038 necessario, ma aumenta la portabilità, e serve in caso si debba accedere
1039 ai campi di \var{rusage} definiti come \type{struct timeval}. La
1040 struttura è ripresa da BSD 4.3, attualmente (con il kernel 2.4.x) i soli
1041 campi che sono mantenuti sono: \var{ru\_utime}, \var{ru\_stime},
1042 \var{ru\_minflt}, \var{ru\_majflt}, e \var{ru\_nswap}.
1043
1044
1045 \subsection{Le funzioni \func{exec}}
1046 \label{sec:proc_exec}
1047
1048 Abbiamo già detto che una delle modalità principali con cui si utilizzano i
1049 processi in Unix è quella di usarli per lanciare nuovi programmi: questo viene
1050 fatto attraverso una delle funzioni della famiglia \func{exec}. Quando un
1051 processo chiama una di queste funzioni esso viene completamente sostituito dal
1052 nuovo programma; il \acr{pid} del processo non cambia, dato che non viene
1053 creato un nuovo processo, la funzione semplicemente rimpiazza lo stack, lo
1054 heap, i dati ed il testo del processo corrente con un nuovo programma letto da
1055 disco. 
1056
1057 Ci sono sei diverse versioni di \func{exec} (per questo la si è chiamata
1058 famiglia di funzioni) che possono essere usate per questo compito, in realtà
1059 (come mostrato in \figref{fig:proc_exec_relat}), sono tutte un front-end a
1060 \func{execve}. Il prototipo di quest'ultima è:
1061 \begin{prototype}{unistd.h}
1062 {int execve(const char *filename, char *const argv[], char *const envp[])}
1063   Esegue il programma contenuto nel file \param{filename}.
1064   
1065   \bodydesc{La funzione ritorna -1 solo in caso di errore, nel qual caso
1066     caso la \var{errno} può assumere i valori:
1067   \begin{errlist}
1068   \item[\macro{EACCES}] il file non è eseguibile, oppure il filesystem è
1069     montato in \cmd{noexec}, oppure non è un file normale o un interprete.
1070   \item[\macro{EPERM}] il file ha i bit \acr{suid} o \acr{sgid}, l'utente non
1071     è root, e o il processo viene tracciato, o il filesystem è montato con
1072     l'opzione \cmd{nosuid}.
1073   \item[\macro{ENOEXEC}] il file è in un formato non eseguibile o non
1074     riconosciuto come tale, o compilato per un'altra architettura.
1075   \item[\macro{ENOENT}] il file o una delle librerie dinamiche o l'interprete
1076     necessari per eseguirlo non esistono.
1077   \item[\macro{ETXTBSY}] L'eseguibile è aperto in scrittura da uno o più
1078     processi. 
1079   \item[\macro{EINVAL}] L'eseguibile ELF ha più di un segmento
1080     \macro{PF\_INTERP}, cioè chiede di essere eseguito da più di un
1081     interprete.
1082   \item[\macro{ELIBBAD}] Un interprete ELF non è in un formato
1083     riconoscibile.
1084   \end{errlist}
1085   ed inoltre anche \macro{EFAULT}, \macro{ENOMEM}, \macro{EIO},
1086   \macro{ENAMETOOLONG}, \macro{E2BIG}, \macro{ELOOP}, \macro{ENOTDIR},
1087   \macro{ENFILE}, \macro{EMFILE}.}
1088 \end{prototype}
1089
1090 La funzione \func{exec} esegue il file o lo script indicato da
1091 \var{filename}, passandogli la lista di argomenti indicata da \var{argv}
1092 e come ambiente la lista di stringhe indicata da \var{envp}; entrambe le
1093 liste devono essere terminate da un puntatore nullo. I vettori degli
1094 argomenti e dell'ambiente possono essere acceduti dal nuovo programma
1095 quando la sua funzione \func{main} è dichiarata nella forma
1096 \code{main(int argc, char *argv[], char *envp[])}.
1097
1098 Le altre funzioni della famiglia servono per fornire all'utente una serie
1099 possibile di diverse interfacce per la creazione di un nuovo processo. I loro
1100 prototipi sono:
1101 \begin{functions}
1102 \headdecl{unistd.h}
1103 \funcdecl{int execl(const char *path, const char *arg, ...)} 
1104 \funcdecl{int execv(const char *path, char *const argv[])} 
1105 \funcdecl{int execle(const char *path, const char *arg, ..., char 
1106 * const envp[])} 
1107 \funcdecl{int execlp(const char *file, const char *arg, ...)} 
1108 \funcdecl{int execvp(const char *file, char *const argv[])} 
1109
1110 Sostituiscono l'immagine corrente del processo con quella indicata nel primo
1111 argomento. I parametri successivi consentono di specificare gli argomenti a
1112 linea di comando e l'ambiente ricevuti dal nuovo processo.
1113
1114 \bodydesc{Queste funzioni ritornano solo in caso di errore, restituendo
1115   -1; nel qual caso \var{errno} andrà ad assumere i valori visti in
1116   precedenza per \func{execve}.}
1117 \end{functions}
1118
1119 Per capire meglio le differenze fra le funzioni della famiglia si può fare
1120 riferimento allo specchietto riportato in \ntab. La prima differenza riguarda
1121 le modalità di passaggio dei parametri che poi andranno a costituire gli
1122 argomenti a linea di comando (cioè i valori di \var{argv} e \var{argc} visti
1123 dalla funzione \func{main} del programma chiamato). 
1124
1125 Queste modalità sono due e sono riassunte dagli mnemonici \code{v} e \code{l}
1126 che stanno rispettivamente per \textit{vector} e \textit{list}. Nel primo caso
1127 gli argomenti sono passati tramite il vettore di puntatori \var{argv[]} a
1128 stringhe terminate con zero che costituiranno gli argomenti a riga di comando,
1129 questo vettore \emph{deve} essere terminato da un puntatore nullo.
1130
1131 Nel secondo caso le stringhe degli argomenti sono passate alla funzione come
1132 lista di puntatori, nella forma:
1133 \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
1134   char *arg0, char *arg1,  ..., char *argn, NULL
1135 \end{lstlisting}
1136 che deve essere terminata da un puntatore nullo.  In entrambi i casi vale la
1137 convenzione che il primo argomento (\var{arg0} o \var{argv[0]}) viene usato
1138 per indicare il nome del file che contiene il programma che verrà eseguito.
1139
1140 \begin{table}[!htb]
1141   \footnotesize
1142   \centering
1143   \begin{tabular}[c]{|l|c|c|c||c|c|c|}
1144     \hline
1145     \multicolumn{1}{|c|}{\textbf{Caratteristiche}} & 
1146     \multicolumn{6}{|c|}{\textbf{Funzioni}} \\
1147     \hline
1148     &\func{execl\ }&\func{execlp}&\func{execle}
1149     &\func{execv\ }& \func{execvp}& \func{execve} \\
1150     \hline
1151     \hline
1152     argomenti a lista    &$\bullet$&$\bullet$&$\bullet$&&& \\
1153     argomenti a vettore  &&&&$\bullet$&$\bullet$&$\bullet$\\
1154     \hline
1155     filename completo    &&$\bullet$&&&$\bullet$& \\ 
1156     ricerca su \var{PATH}&$\bullet$&&$\bullet$&$\bullet$&&$\bullet$ \\
1157     \hline
1158     ambiente a vettore   &&&$\bullet$&&&$\bullet$ \\
1159     uso di \var{environ} &$\bullet$&$\bullet$&&$\bullet$&$\bullet$& \\
1160     \hline
1161   \end{tabular}
1162   \caption{Confronto delle caratteristiche delle varie funzioni della 
1163     famiglia \func{exec}.}
1164   \label{tab:proc_exec_scheme}
1165 \end{table}
1166
1167 La seconda differenza fra le funzioni riguarda le modalità con cui si
1168 specifica il programma che si vuole eseguire. Con lo mnemonico \code{p} si
1169 indicano le due funzioni che replicano il comportamento della shell nello
1170 specificare il comando da eseguire; quando il parametro \var{file} non
1171 contiene una \file{/} esso viene considerato come un nome di programma, e
1172 viene eseguita automaticamente una ricerca fra i file presenti nella lista di
1173 directory specificate dalla variabile di ambiente \var{PATH}. Il file che
1174 viene posto in esecuzione è il primo che viene trovato. Se si ha un errore
1175 relativo a permessi di accesso insufficienti (cioè l'esecuzione della
1176 sottostante \func{execve} ritorna un \macro{EACCESS}), la ricerca viene
1177 proseguita nelle eventuali ulteriori directory indicate in \var{PATH}; solo se
1178 non viene trovato nessun altro file viene finalmente restituito
1179 \macro{EACCESS}.
1180
1181 Le altre quattro funzioni si limitano invece a cercare di eseguire il file
1182 indicato dal parametro \var{path}, che viene interpretato come il
1183 \textit{pathname} del programma.
1184
1185 \begin{figure}[htb]
1186   \centering
1187   \includegraphics[width=13cm]{img/exec_rel}
1188   \caption{La interrelazione fra le sei funzioni della famiglia \func{exec}.}
1189   \label{fig:proc_exec_relat}
1190 \end{figure}
1191
1192 La terza differenza è come viene passata la lista delle variabili di ambiente.
1193 Con lo mnemonico \code{e} vengono indicate quelle funzioni che necessitano di
1194 un vettore di parametri \var{envp[]} analogo a quello usato per gli argomenti
1195 a riga di comando (terminato quindi da un \macro{NULL}), le altre usano il
1196 valore della variabile \var{environ} (vedi \secref{sec:proc_environ}) del
1197 processo di partenza per costruire l'ambiente.
1198
1199 Oltre a mantenere lo stesso \acr{pid}, il nuovo programma fatto partire da
1200 \func{exec} assume anche una serie di altre proprietà del processo chiamante;
1201 la lista completa è la seguente:
1202 \begin{itemize*}
1203 \item il \textit{process id} (\acr{pid}) ed il \textit{parent process id}
1204   (\acr{ppid}).
1205 \item il \textit{real user id} ed il \textit{real group id} (vedi
1206   \secref{sec:proc_access_id}).
1207 \item i \textit{supplementary group id} (vedi \secref{sec:proc_access_id}).
1208 \item il \textit{session id} ed il \textit{process group id} (vedi
1209   \secref{sec:sess_xxx}).
1210 \item il terminale di controllo (vedi \secref{sec:sess_xxx}).
1211 \item il tempo restante ad un allarme (vedi \secref{sec:sig_alarm_abort}).
1212 \item la directory radice e la directory di lavoro corrente (vedi
1213   \secref{sec:file_work_dir}).
1214 \item la maschera di creazione dei file (\var{umask}, vedi
1215   \secref{sec:file_umask}) ed i \textit{lock} sui file (vedi
1216   \secref{sec:file_locking}).
1217 \item i segnali sospesi (\textit{pending}) e la maschera dei segnali (si veda
1218   \secref{sec:sig_sigpending}).
1219 \item i limiti sulle risorse (vedi \secref{sec:sys_limits}).
1220 \item i valori delle variabili \var{tms\_utime}, \var{tms\_stime},
1221   \var{tms\_cutime}, \var{tms\_ustime} (vedi \secref{sec:xxx_xxx}).
1222 \end{itemize*}
1223
1224 Inoltre i segnali che sono stati settati per essere ignorati nel processo
1225 chiamante mantengono lo stesso settaggio pure nel nuovo programma, tutti gli
1226 altri segnali vengono settati alla loro azione di default. Un caso speciale è
1227 il segnale \macro{SIGCHLD} che, quando settato a \macro{SIG\_IGN}, può anche
1228 non essere resettato a \macro{SIG\_DFL} (si veda \secref{sec:sig_gen_beha}).
1229
1230 La gestione dei file aperti dipende dal valore che ha il flag di
1231 \textit{close-on-exec} (trattato in \secref{sec:file_fcntl}) per ciascun file
1232 descriptor. I file per cui è settato vengono chiusi, tutti gli altri file
1233 restano aperti. Questo significa che il comportamento di default è che i file
1234 restano aperti attraverso una \func{exec}, a meno di una chiamata esplicita a
1235 \func{fcntl} che setti il suddetto flag.
1236
1237 Per le directory, lo standard POSIX.1 richiede che esse vengano chiuse
1238 attraverso una \func{exec}, in genere questo è fatto dalla funzione
1239 \func{opendir} (vedi \secref{sec:file_dir_read}) che effettua da sola il
1240 settaggio del flag di \textit{close-on-exec} sulle directory che apre, in
1241 maniera trasparente all'utente.
1242
1243 Abbiamo detto che il \textit{real user id} ed il \textit{real group id}
1244 restano gli stessi all'esecuzione di \func{exec}; lo stesso vale per
1245 l'\textit{effective user id} ed l'\textit{effective group id}, tranne quando
1246 il file che si va ad eseguire abbia o il \acr{suid} bit o lo \acr{sgid} bit
1247 settato, in questo caso l'\textit{effective user id} e l'\textit{effective
1248   group id} vengono settati rispettivamente all'utente o al gruppo cui il file
1249 appartiene (per i dettagli vedi \secref{sec:proc_perms}).
1250
1251 Se il file da eseguire è in formato \emph{a.out} e necessita di librerie
1252 condivise, viene lanciato il \textit{linker} dinamico \cmd{ld.so} prima del
1253 programma per caricare le librerie necessarie ed effettuare il link
1254 dell'eseguibile. Se il programma è in formato ELF per caricare le librerie
1255 dinamiche viene usato l'interprete indicato nel segmento \macro{PT\_INTERP},
1256 in genere questo è \file{/lib/ld-linux.so.1} per programmi linkati con le
1257 \emph{libc5}, e \file{/lib/ld-linux.so.2} per programmi linkati con le
1258 \emph{glibc}. Infine nel caso il file sia uno script esso deve iniziare con
1259 una linea nella forma \cmd{\#!/path/to/interpreter} dove l'interprete indicato
1260 deve esse un valido programma (binario, non un altro script) che verrà
1261 chiamato come se si fosse eseguito il comando \cmd{interpreter [arg]
1262   filename}.
1263
1264 Con la famiglia delle \func{exec} si chiude il novero delle funzioni su cui è
1265 basata la gestione dei processi in Unix: con \func{fork} si crea un nuovo
1266 processo, con \func{exec} si avvia un nuovo programma, con \func{exit} e
1267 \func{wait} si effettua e verifica la conclusione dei programmi. Tutte le
1268 altre funzioni sono ausiliarie e servono la lettura e il settaggio dei vari
1269 parametri connessi ai processi.
1270
1271
1272
1273 \section{Il controllo di accesso}
1274 \label{sec:proc_perms}
1275
1276 In questa sezione esamineremo le problematiche relative al controllo di
1277 accesso dal punto di vista del processi; vedremo quali sono gli identificatori
1278 usati, come questi possono essere modificati nella creazione e nel lancio di
1279 nuovi processi, le varie funzioni per la loro manipolazione diretta e tutte le
1280 problematiche connesse ad una gestione accorta dei privilegi.
1281
1282
1283 \subsection{Gli identificatori del controllo di accesso}
1284 \label{sec:proc_access_id}
1285
1286 Come accennato in \secref{sec:intro_multiuser} il modello base\footnote{in
1287   realtà già esistono estensioni di questo modello base, che lo rendono più
1288   flessibile e controllabile, come le \textit{capabilities}, le ACL per i file
1289   o il \textit{Mandatory Access Control} di SELinux.} di sicurezza di un
1290 sistema unix-like è fondato sui concetti di utente e gruppo, e sulla
1291 separazione fra l'amministratore (\textsl{root}, detto spesso anche
1292 \textit{superuser}) che non è sottoposto a restrizioni, ed il resto degli
1293 utenti, per i quali invece vengono effettuati i vari controlli di accesso.
1294
1295 %Benché il sistema sia piuttosto semplice (è basato su un solo livello di
1296 % separazione) il sistema permette una
1297 %notevole flessibilità, 
1298
1299 Abbiamo già accennato come il sistema associ ad ogni utente e gruppo due
1300 identificatori univoci, lo \acr{uid} e il \acr{gid}; questi servono al kernel
1301 per identificare uno specifico utente o un gruppo di utenti, per poi poter
1302 controllare che essi siano autorizzati a compiere le operazioni richieste.  Ad
1303 esempio in \secref{sec:file_access_control} vedremo come ad ogni file vengano
1304 associati un utente ed un gruppo (i suoi \textsl{proprietari}, indicati
1305 appunto tramite un \acr{uid} ed un \acr{gid}) che vengono controllati dal
1306 kernel nella gestione dei permessi di accesso.
1307
1308 Dato che tutte le operazioni del sistema vengono compiute dai processi, è
1309 evidente che per poter implementare un controllo sulle operazioni occorre
1310 anche poter identificare chi è che ha lanciato un certo programma, e pertanto
1311 anche a ciascun processo è associato un utente e a un gruppo.
1312
1313 Un semplice controllo di una corrispondenza fra identificativi non garantisce
1314 però sufficiente flessibilità per tutti quei casi in cui è necessario poter
1315 disporre di privilegi diversi, o dover impersonare un altro utente per un
1316 limitato insieme di operazioni. Per questo motivo in generale tutti gli Unix
1317 prevedono che i processi abbiano almeno due gruppi di identificatori, chiamati
1318 rispettivamente \textit{real} ed \textit{effective}.
1319
1320 \begin{table}[htb]
1321   \footnotesize
1322   \centering
1323   \begin{tabular}[c]{|c|l|p{6.5cm}|}
1324     \hline
1325     \textbf{Suffisso} & \textbf{Significato} & \textbf{Utilizzo} \\ 
1326     \hline
1327     \hline
1328     \acr{uid}   & \textit{real user id} & indica l'utente che ha lanciato
1329     il programma\\ 
1330     \acr{gid}   & \textit{real group id} & indica il gruppo dell'utente 
1331     che ha lanciato il programma \\ 
1332     \hline
1333     \acr{euid}  & \textit{effective user id} & indica l'utente usato
1334     dal programma nel controllo di accesso \\ 
1335     \acr{egid}  & \textit{effective group id} & indica il gruppo 
1336     usato dal programma  nel controllo di accesso \\ 
1337     --          & \textit{supplementary group id} & indica i gruppi cui
1338     l'utente appartiene  \\ 
1339     \hline
1340     --          & \textit{saved user id} &  copia dell'\acr{euid} iniziale\\ 
1341     --          & \textit{saved group id} &  copia dell'\acr{egid} iniziale \\ 
1342     \hline
1343     \acr{fsuid} & \textit{filesystem user id} & indica l'utente effettivo per
1344     il filesystem \\ 
1345     \acr{fsgid} & \textit{filesystem group id} & indica il gruppo effettivo
1346     per il filesystem  \\ 
1347     \hline
1348   \end{tabular}
1349   \caption{Identificatori di utente e gruppo associati a ciascun processo con
1350     indicazione dei suffissi usati dalle varie funzioni di manipolazione.}
1351   \label{tab:proc_uid_gid}
1352 \end{table}
1353
1354 Al primo gruppo appartengono il \textit{real user id} e il \textit{real group
1355   id}: questi vengono settati al login ai valori corrispondenti all'utente con
1356 cui si accede al sistema (e relativo gruppo di default). Servono per
1357 l'identificazione dell'utente e normalmente non vengono mai cambiati. In
1358 realtà vedremo (in \secref{sec:proc_setuid}) che è possibile modificarli, ma
1359 solo ad un processo che abbia i privilegi di amministratore; questa
1360 possibilità è usata ad esempio da \cmd{login} che, una volta completata la
1361 procedura di autenticazione, lancia una shell per la quale setta questi
1362 identificatori ai valori corrispondenti all'utente che entra nel sistema.
1363
1364 Al secondo gruppo appartengono l'\textit{effective user id} e
1365 l'\textit{effective group id} (a cui si aggiungono gli eventuali
1366 \textit{supplementary group id} dei gruppi dei quali l'utente fa parte).
1367 Questi sono invece gli identificatori usati nella verifiche dei permessi del
1368 processo e per il controllo di accesso ai file (argomento affrontato in
1369 dettaglio in \secref{sec:file_perm_overview}). 
1370
1371 Questi identificatori normalmente sono identici ai corrispondenti del gruppo
1372 \textit{real} tranne nel caso in cui, come accennato in
1373 \secref{sec:proc_exec}, il programma che si è posto in esecuzione abbia i bit
1374 \acr{suid} o \acr{sgid} settati (il significato di questi bit è affrontato in
1375 dettaglio in \secref{sec:file_suid_sgid}). In questo caso essi saranno settati
1376 all'utente e al gruppo proprietari del file. Questo consente, per programmi in
1377 cui ci sia necessità, di dare a qualunque utente normale privilegi o permessi
1378 di un'altro (o dell'amministratore).
1379
1380 Come nel caso del \acr{pid} e del \acr{ppid} tutti questi identificatori
1381 possono essere letti dal processo attraverso delle opportune funzioni, i cui
1382 prototipi sono i seguenti:
1383 \begin{functions}
1384   \headdecl{unistd.h}
1385   \headdecl{sys/types.h}  
1386   \funcdecl{uid\_t getuid(void)} Restituisce il \textit{real user id} del
1387   processo corrente.
1388
1389   \funcdecl{uid\_t geteuid(void)} Restituisce l'\textit{effective user id} del
1390   processo corrente.
1391
1392   \funcdecl{gid\_t getgid(void)} Restituisce il \textit{real group id} del
1393   processo corrente.
1394
1395   \funcdecl{gid\_t getegid(void)} Restituisce l'\textit{effective group id} del
1396   processo corrente.
1397   
1398   \bodydesc{Queste funzioni non riportano condizioni di errore.}
1399 \end{functions}
1400
1401 In generale l'uso di privilegi superiori deve essere limitato il più
1402 possibile, per evitare abusi e problemi di sicurezza, per questo occorre anche
1403 un meccanismo che consenta ad un programma di rilasciare gli eventuali
1404 maggiori privilegi necessari, una volta che si siano effettuate le operazioni
1405 per i quali erano richiesti, e a poterli eventualmente recuperare in caso
1406 servano di nuovo.
1407
1408 Questo in Linux viene fatto usando altri due gruppi di identificatori, il
1409 \textit{saved} ed il \textit{filesystem}, analoghi ai precedenti. Il primo
1410 gruppo è lo stesso usato in SVr4, e previsto dallo standard POSIX quando è
1411 definita la costante \macro{\_POSIX\_SAVED\_IDS},\footnote{in caso si abbia a
1412   cuore la portabilità del programma su altri Unix è buona norma controllare
1413   sempre la disponibilità di queste funzioni controllando se questa costante è
1414   definita.} il secondo gruppo è specifico di Linux e viene usato per
1415 migliorare la sicurezza con NFS.
1416
1417 Il \textit{saved user id} e il \textit{saved group id} sono copie
1418 dell'\textit{effective user id} e dell'\textit{effective group id} del
1419 processo padre, e vengono settati dalla funzione \func{exec} all'avvio del
1420 processo, come copie dell'\textit{effective user id} e dell'\textit{effective
1421   group id} dopo che questo sono stati settati tenendo conto di eventuali
1422 \acr{suid} o \acr{sgid}.  Essi quindi consentono di tenere traccia di quale
1423 fossero utente e gruppo effettivi all'inizio dell'esecuzione di un nuovo
1424 programma.
1425
1426 Il \textit{filesystem user id} e il \textit{filesystem group id} sono una
1427 estensione introdotta in Linux per rendere più sicuro l'uso di NFS (torneremo
1428 sull'argomento in \secref{sec:proc_setfsuid}). Essi sono una replica dei
1429 corrispondenti \textit{effective id}, ai quali si sostituiscono per tutte le
1430 operazioni di verifica dei permessi relativi ai file (trattate in
1431 \secref{sec:file_perm_overview}).  Ogni cambiamento effettuato sugli
1432 \textit{effective id} viene automaticamente riportato su di essi, per cui in
1433 condizioni normali se ne può tranquillamente ignorare l'esistenza, in quanto
1434 saranno del tutto equivalenti ai precedenti.
1435
1436 Uno specchietto riassuntivo, contenente l'elenco completo degli identificatori
1437 di utente e gruppo associati dal kernel ad ogni processo, è riportato in
1438 \tabref{tab:proc_uid_gid}.
1439
1440
1441 \subsection{Le funzioni \func{setuid} e \func{setgid}}
1442 \label{sec:proc_setuid}
1443
1444 Le due funzioni che vengono usate per cambiare identità (cioè utente e gruppo
1445 di appartenenza) ad un processo sono rispettivamente \func{setuid} e
1446 \func{setgid}; come accennato in \secref{sec:proc_access_id} in Linux esse
1447 seguono la semantica POSIX che prevede l'esistenza del \textit{saved user id}
1448 e del \textit{saved group id}; i loro prototipi sono:
1449 \begin{functions}
1450 \headdecl{unistd.h}
1451 \headdecl{sys/types.h}
1452
1453 \funcdecl{int setuid(uid\_t uid)} Setta l'\textit{user id} del processo
1454 corrente.
1455
1456 \funcdecl{int setgid(gid\_t gid)} Setta il \textit{group id} del processo
1457 corrente.
1458
1459 \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso
1460   di fallimento: l'unico errore possibile è \macro{EPERM}.}
1461 \end{functions}
1462
1463 Il funzionamento di queste due funzioni è analogo, per cui considereremo solo
1464 la prima; la seconda si comporta esattamente allo stesso modo facendo
1465 riferimento al \textit{group id} invece che all'\textit{user id}.  Gli
1466 eventuali \textit{supplementary group id} non vengono modificati.
1467
1468
1469 L'effetto della chiamata è diverso a seconda dei privilegi del processo; se
1470 l'\textit{effective user id} è zero (cioè è quello dell'amministratore di
1471 sistema) allora tutti gli identificatori (\textit{real}, \textit{effective}
1472 e \textit{saved}) vengono settati al valore specificato da \var{uid},
1473 altrimenti viene settato solo l'\textit{effective user id}, e soltanto se il
1474 valore specificato corrisponde o al \textit{real user id} o al \textit{saved
1475   user id}. Negli altri casi viene segnalato un errore (con \macro{EPERM}).
1476
1477 Come accennato l'uso principale di queste funzioni è quello di poter
1478 consentire ad un programma con i bit \acr{suid} o \acr{sgid} settati di
1479 riportare l'\textit{effective user id} a quello dell'utente che ha lanciato il
1480 programma, effettuare il lavoro che non necessita di privilegi aggiuntivi, ed
1481 eventualmente tornare indietro.
1482
1483 Come esempio per chiarire l'uso di queste funzioni prendiamo quello con cui
1484 viene gestito l'accesso al file \file{/var/log/utmp}.  In questo file viene
1485 registrato chi sta usando il sistema al momento corrente; chiaramente non può
1486 essere lasciato aperto in scrittura a qualunque utente, che potrebbe
1487 falsificare la registrazione. Per questo motivo questo file (e l'analogo
1488 \file{/var/log/wtmp} su cui vengono registrati login e logout) appartengono ad
1489 un gruppo dedicato (\acr{utmp}) ed i programmi che devono accedervi (ad
1490 esempio tutti i programmi di terminale in X, o il programma \cmd{screen} che
1491 crea terminali multipli su una console) appartengono a questo gruppo ed hanno
1492 il bit \acr{sgid} settato.
1493
1494 Quando uno di questi programmi (ad esempio \cmd{xterm}) viene lanciato, la
1495 situazione degli identificatori è la seguente:
1496 \begin{eqnarray*}
1497   \label{eq:1}
1498   \textit{real group id}      &=& \textrm{\acr{gid} (del chiamante)} \\
1499   \textit{effective group id} &=& \textrm{\acr{utmp}} \\
1500   \textit{saved group id}     &=& \textrm{\acr{utmp}}
1501 \end{eqnarray*}
1502 in questo modo, dato che l'\textit{effective group id} è quello giusto, il
1503 programma può accedere a \file{/var/log/utmp} in scrittura ed aggiornarlo. A
1504 questo punto il programma può eseguire una \code{setgid(getgid())} per settare
1505 l'\textit{effective group id} a quello dell'utente (e dato che il \textit{real
1506   group id} corrisponde la funzione avrà successo), in questo modo non sarà
1507 possibile lanciare dal terminale programmi che modificano detto file, in tal
1508 caso infatti la situazione degli identificatori sarebbe:
1509 \begin{eqnarray*}
1510   \label{eq:2}
1511   \textit{real group id}      &=& \textrm{\acr{gid} (invariato)}  \\
1512   \textit{effective group id} &=& \textrm{\acr{gid}} \\
1513   \textit{saved group id}     &=& \textrm{\acr{utmp} (invariato)}
1514 \end{eqnarray*}
1515 e ogni processo lanciato dal terminale avrebbe comunque \acr{gid} come
1516 \textit{effective group id}. All'uscita dal terminale, per poter di nuovo
1517 aggiornare lo stato di \file{/var/log/utmp} il programma eseguirà una
1518 \code{setgid(utmp)} (dove \var{utmp} è il valore numerico associato al gruppo
1519 \acr{utmp}, ottenuto ad esempio con una precedente \func{getegid}), dato che
1520 in questo caso il valore richiesto corrisponde al \textit{saved group id} la
1521 funzione avrà successo e riporterà la situazione a:
1522 \begin{eqnarray*}
1523   \label{eq:3}
1524   \textit{real group id}      &=& \textrm{\acr{gid} (invariato)}  \\
1525   \textit{effective group id} &=& \textrm{\acr{utmp}} \\
1526   \textit{saved group id}     &=& \textrm{\acr{utmp} (invariato)}
1527 \end{eqnarray*}
1528 consentendo l'accesso a \file{/var/log/utmp}.
1529
1530 Occorre però tenere conto che tutto questo non è possibile con un processo con
1531 i privilegi di root, in tal caso infatti l'esecuzione una \func{setuid}
1532 comporta il cambiamento di tutti gli identificatori associati al processo,
1533 rendendo impossibile riguadagnare i privilegi di amministratore.  Questo
1534 comportamento è corretto per l'uso che ne fa \cmd{login} una volta che crea
1535 una nuova shell per l'utente; ma quando si vuole cambiare soltanto
1536 l'\textit{effective user id} del processo per cedere i privilegi occorre
1537 ricorrere ad altre funzioni (si veda ad esempio \secref{sec:proc_seteuid}).
1538
1539
1540 \subsection{Le funzioni \func{setreuid} e \func{setresuid}}
1541 \label{sec:proc_setreuid}
1542
1543 Queste due funzioni derivano da BSD che, non supportando\footnote{almeno fino
1544   alla versione 4.3+BSD TODO, FIXME verificare e aggiornare la nota.} i
1545 \textit{saved id}, le usava per poter scambiare fra di loro \textit{effective}
1546 e \textit{real id}. I loro prototipi sono:
1547 \begin{functions}
1548 \headdecl{unistd.h}
1549 \headdecl{sys/types.h}
1550
1551 \funcdecl{int setreuid(uid\_t ruid, uid\_t euid)} Setta il \textit{real user
1552   id} e l'\textit{effective user id} del processo corrente ai valori
1553 specificati da \var{ruid} e \var{euid}.
1554   
1555 \funcdecl{int setregid(gid\_t rgid, gid\_t egid)} Setta il \textit{real group
1556   id} e l'\textit{effective group id} del processo corrente ai valori
1557 specificati da \var{rgid} e \var{egid}.
1558
1559 \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso
1560   di fallimento: l'unico errore possibile è \macro{EPERM}.}
1561 \end{functions}
1562
1563 I processi non privilegiati possono settare i \textit{real id} soltanto ai
1564 valori dei loro \textit{effective id} o \textit{real id} e gli
1565 \textit{effective id} ai valori dei loro \textit{real id}, \textit{effective
1566   id} o \textit{saved id}; valori diversi comportano il fallimento della
1567 chiamata; l'amministratore invece può specificare un valore qualunque.
1568 Specificando un valore di -1 l'identificatore corrispondente viene lasciato
1569 inalterato.
1570
1571 Con queste funzione si possono scambiare fra loro \textit{real id} e
1572 \textit{effective id}, e pertanto è possibile implementare un comportamento
1573 simile a quello visto in precedenza per \func{setgid}, cedendo i privilegi con
1574 un primo scambio, e recuperandoli, eseguito il lavoro non privilegiato, con un
1575 secondo scambio.
1576
1577 In questo caso però occorre porre molta attenzione quando si creano nuovi
1578 processi nella fase intermedia in cui si sono scambiati gli identificatori, in
1579 questo caso infatti essi avranno un \textit{real id} privilegiato, che dovrà
1580 essere esplicitamente eliminato prima di porre in esecuzione un nuovo
1581 programma (occorrerà cioè eseguire un'altra chiamata dopo la \func{fork}, e
1582 prima della \func{exec} per uniformare i \textit{real id} agli
1583 \textit{effective id}) in caso contrario quest'ultimo potrebbe a sua volta
1584 effettuare uno scambio e riottenere privilegi non previsti.
1585
1586 Lo stesso problema di propagazione dei privilegi ad eventuali processi figli
1587 si porrebbe per i \textit{saved id}: queste funzioni derivano da
1588 un'implementazione che non ne prevede la presenza, e quindi non è possibile
1589 usarle per correggere la situazione come nel caso precedente. Per questo
1590 motivo in Linux tutte le volte che vengono usate per modificare uno degli
1591 identificatori ad un valore diverso dal \textit{real id} precedente, il
1592 \textit{saved id} viene sempre settato al valore dell'\textit{effective id}.
1593
1594
1595
1596 \subsection{Le funzioni \func{seteuid} e \func{setegid}}
1597 \label{sec:proc_seteuid}
1598
1599 Queste funzioni sono un'estensione allo standard POSIX.1 (ma sono comunque
1600 supportate dalla maggior parte degli Unix) e usate per cambiare gli
1601 \textit{effective id}; i loro prototipi sono:
1602 \begin{functions}
1603 \headdecl{unistd.h}
1604 \headdecl{sys/types.h}
1605
1606 \funcdecl{int seteuid(uid\_t uid)} Setta l'\textit{effective user id} del
1607 processo corrente a \var{uid}.
1608
1609 \funcdecl{int setegid(gid\_t gid)} Setta l'\textit{effective group id} del
1610 processo corrente a \var{gid}.
1611
1612 \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso
1613   di fallimento: l'unico errore possibile è \macro{EPERM}.}
1614 \end{functions}
1615
1616 Gli utenti normali possono settare l'\textit{effective id} solo al valore del
1617 \textit{real id} o del \textit{saved id}, l'amministratore può specificare
1618 qualunque valore. Queste funzioni sono usate per permettere a root di settare
1619 solo l'\textit{effective id}, dato che l'uso normale di \func{setuid} comporta
1620 il settaggio di tutti gli identificatori.
1621  
1622
1623 \subsection{Le funzioni \func{setresuid} e \func{setresgid}}
1624 \label{sec:proc_setresuid}
1625
1626 Queste due funzioni sono un'estensione introdotta in Linux dal kernel 2.1.44,
1627 e permettono un completo controllo su tutti gli identificatori (\textit{real},
1628 \textit{effective} e \textit{saved}), i prototipi sono:
1629 \begin{functions}
1630 \headdecl{unistd.h}
1631 \headdecl{sys/types.h}
1632
1633 \funcdecl{int setresuid(uid\_t ruid, uid\_t euid, uid\_t suid)} Setta il
1634 \textit{real user id}, l'\textit{effective user id} e il \textit{saved user
1635   id} del processo corrente ai valori specificati rispettivamente da
1636 \var{ruid}, \var{euid} e \var{suid}.
1637   
1638 \funcdecl{int setresgid(gid\_t rgid, gid\_t egid, gid\_t sgid)} Setta il
1639 \textit{real group id}, l'\textit{effective group id} e il \textit{saved group
1640   id} del processo corrente ai valori specificati rispettivamente da
1641 \var{rgid}, \var{egid} e \var{sgid}.
1642
1643 \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso
1644   di fallimento: l'unico errore possibile è \macro{EPERM}.}
1645 \end{functions}
1646
1647 I processi non privilegiati possono cambiare uno qualunque degli
1648 identificatori usando uno qualunque dei valori correnti di \textit{real id},
1649 \textit{effective id} o \textit{saved id}, l'amministratore può specificare i
1650 valori che vuole; un valore di -1 per un qualunque parametro lascia inalterato
1651 l'identificatore corrispondente.
1652
1653 Per queste funzioni esistono anche due controparti che permettono di leggere
1654 in blocco i vari identificatori: \func{getresuid} e \func{getresgid}; i loro
1655 prototipi sono: 
1656 \begin{functions}
1657 \headdecl{unistd.h}
1658 \headdecl{sys/types.h}
1659
1660 \funcdecl{int getresuid(uid\_t *ruid, uid\_t *euid, uid\_t *suid)} Legge il
1661 \textit{real user id}, l'\textit{effective user id} e il \textit{saved user
1662   id} del processo corrente.
1663   
1664 \funcdecl{int getresgid(gid\_t *rgid, gid\_t *egid, gid\_t *sgid)} Legge il
1665 \textit{real group id}, l'\textit{effective group id} e il \textit{saved group
1666   id} del processo corrente.
1667
1668 \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso di
1669   fallimento: l'unico errore possibile è \macro{EFAULT} se gli indirizzi delle
1670   variabili di ritorno non sono validi.}
1671 \end{functions}
1672
1673 Anche queste funzioni sono un'estensione specifica di Linux, e non richiedono
1674 nessun privilegio. I valori sono restituiti negli argomenti, che vanno
1675 specificati come puntatori (è un'altro esempio di \textit{value result
1676   argument}). Si noti che queste funzioni sono le uniche in grado di leggere i
1677 \textit{saved id}.
1678
1679
1680 \subsection{Le funzioni \func{setfsuid} e \func{setfsgid}}
1681 \label{sec:proc_setfsuid}
1682
1683 Queste funzioni sono usate per settare gli identificatori usati da Linux per
1684 il controllo dell'accesso ai file. Come già accennato in
1685 \secref{sec:proc_access_id} in Linux è definito questo ulteriore gruppo di
1686 identificatori, che di norma sono assolutamente equivalenti agli
1687 \textit{effective id}, dato che ogni cambiamento di questi ultimi viene
1688 immediatamente riportato sui \textit{filesystem id}.
1689
1690 C'è un solo caso in cui si ha necessità di introdurre una differenza fra
1691 \textit{effective id} e \textit{filesystem id}, ed è per ovviare ad un
1692 problema di sicurezza che si presenta quando si deve implementare un server
1693 NFS. Il server NFS infatti deve poter cambiare l'identificatore con cui accede
1694 ai file per assumere l'identità del singolo utente remoto, ma se questo viene
1695 fatto cambiando l'\textit{effective id} o il \textit{real id} il server si
1696 espone alla ricezione di eventuali segnali ostili da parte dell'utente di cui
1697 ha temporaneamente assunto l'identità.  Cambiando solo il \textit{filesystem
1698   id} si ottengono i privilegi necessari per accedere ai file, mantenendo
1699 quelli originari per quanto riguarda tutti gli altri controlli di accesso,
1700 così che l'utente non possa inviare segnali al server NFS.
1701
1702 Le due funzioni usate per cambiare questi identificatori sono \func{setfsuid}
1703 e \func{setfsgid}, ovviamente sono specifiche di Linux e non devono essere
1704 usate se si intendono scrivere programmi portabili; i loro prototipi sono:
1705 \begin{functions}
1706 \headdecl{sys/fsuid.h}
1707
1708 \funcdecl{int setfsuid(uid\_t fsuid)} Setta il \textit{filesystem user id} del
1709 processo corrente a \var{fsuid}.
1710
1711 \funcdecl{int setfsgid(gid\_t fsgid)} Setta l'\textit{filesystem group id} del
1712 processo corrente a \var{fsgid}.
1713
1714 \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso
1715   di fallimento: l'unico errore possibile è \macro{EPERM}.}
1716 \end{functions}
1717 \noindent queste funzioni hanno successo solo se il processo chiamante ha i
1718 privilegi di amministratore o, per gli altri utenti, se il valore specificato
1719 coincide con uno dei \textit{real}, \textit{effective} o \textit{saved id}.
1720
1721
1722 \subsection{Le funzioni \func{setgroups} e \func{getgroups}}
1723 \label{sec:proc_setgroups}
1724
1725 Le ultime funzioni che esamineremo sono quelle che permettono di operare sui
1726 gruppi supplementari. Ogni processo può avere fino a \macro{NGROUPS\_MAX}
1727 gruppi supplementari in aggiunta al gruppo primario, questi vengono ereditati
1728 dal processo padre e possono essere cambiati con queste funzioni.
1729
1730 La funzione che permette di leggere i gruppi supplementari è \func{getgroups};
1731 questa funzione è definita nello standard POSIX ed il suo prototipo è:
1732 \begin{functions}
1733   \headdecl{sys/types.h}
1734   \headdecl{unistd.h}
1735   
1736   \funcdecl{int getgroups(int size, gid\_t list[])} Legge gli identificatori
1737   dei gruppi supplementari del processo sul vettore \param{list} di dimensione
1738   \param{size}.
1739   
1740   \bodydesc{La funzione restituisce il numero di gruppi letti in caso di
1741     successo e -1 in caso di fallimento, nel qual caso \var{errno} viene
1742     settata a: 
1743     \begin{errlist}
1744     \item[\macro{EFAULT}] \param{list} non ha un indirizzo valido.
1745     \item[\macro{EINVAL}] il valore di \param{size} è diverso da zero ma
1746       minore del numero di gruppi supplementari del processo.
1747     \end{errlist}}
1748 \end{functions}
1749 \noindent non è specificato se la funzione inserisca o meno nella lista
1750 l'\textit{effective user id} del processo. Se si specifica un valore di
1751 \param{size} uguale a 0 \param{list} non viene modificato, ma si ottiene il
1752 numero di gruppi supplementari.
1753
1754 Una seconda funzione, \func{getgrouplist}, può invece essere usata per
1755 ottenere tutti i gruppi a cui appartiene un utente; il suo prototipo è:
1756 \begin{functions}
1757   \headdecl{sys/types.h} 
1758   \headdecl{grp.h}
1759   
1760   \funcdecl{int getgrouplist(const char *user, gid\_t group, gid\_t *groups,
1761     int *ngroups)} Legge i gruppi supplementari dell'utente \param{user}.
1762   
1763   \bodydesc{La funzione legge fino ad un massimo di \param{ngroups} valori,
1764     restituisce 0 in caso di successo e -1 in caso di fallimento.}
1765 \end{functions}
1766 \noindent la funzione esegue una scansione del database dei gruppi (si veda
1767 \secref{sec:sys_user_group}) e ritorna in \param{groups} la lista di quelli a
1768 cui l'utente appartiene. Si noti che \param{ngroups} è passato come puntatore
1769 perché qualora il valore specificato sia troppo piccolo la funzione ritorna
1770 -1, passando indietro il numero dei gruppi trovati.
1771
1772 Per settare i gruppi supplementari di un processo ci sono due funzioni, che
1773 possono essere usate solo se si hanno i privilegi di amministratore. La prima
1774 delle due è \func{setgroups}, ed il suo prototipo è:
1775 \begin{functions}
1776   \headdecl{sys/types.h}
1777   \headdecl{grp.h}
1778   
1779   \funcdecl{int setgroups(size\_t size, gid\_t *list)} Setta i gruppi
1780   supplementari del processo ai valori specificati in \param{list}.
1781
1782   \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
1783     fallimento, nel qual caso \var{errno} viene settata a:
1784     \begin{errlist}
1785     \item[\macro{EFAULT}] \param{list} non ha un indirizzo valido.
1786     \item[\macro{EPERM}] il processo non ha i privilegi di amministratore.
1787     \item[\macro{EINVAL}] il valore di \param{size} è maggiore del valore
1788     massimo (\macro{NGROUPS}, che per Linux è 32).
1789     \end{errlist}}
1790 \end{functions}
1791
1792 Se invece si vogliono settare i gruppi supplementari del processo a quelli di
1793 un utente specifico, si può usare \func{initgroups} il cui prototipo è:
1794 \begin{functions}
1795   \headdecl{sys/types.h}
1796   \headdecl{grp.h}
1797
1798   \funcdecl{int initgroups(const char *user, gid\_t group)} Setta i gruppi
1799   supplementari del processo a quelli di cui è membro l'utente \param{user},
1800   aggiungendo il gruppo addizionale \param{group}.
1801   
1802   \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
1803     fallimento, nel qual caso \var{errno} viene settata agli stessi valori di
1804     \func{setgroups} più \macro{ENOMEM} quando non c'è memoria sufficiente per
1805     allocare lo spazio per informazioni dei gruppi.}
1806 \end{functions}
1807
1808 La funzione esegue la scansione del database dei gruppi (usualmente
1809 \file{/etc/groups}) cercando i gruppi di cui è membro \param{user} e
1810 costruendo una lista di gruppi supplementari a cui aggiunge \param{group}, che
1811 poi setta usando \func{setgroups}.
1812
1813 Si tenga presente che sia \func{setgroups} che \func{initgroups} non sono
1814 definite nello standard POSIX.1 e che pertanto non è possibile utilizzarle
1815 quando si definisce \macro{\_POSIX\_SOURCE} o si compila con il flag
1816 \cmd{-ansi}.
1817
1818
1819 \section{La gestione della priorità di esecuzione}
1820 \label{sec:proc_priority}
1821
1822 In questa sezione tratteremo più approfonditamente i meccanismi con il quale
1823 lo \textit{scheduler}\footnote{che è la parte del kernel che si occupa di
1824   stabilire quale processo dovrà essere posto in esecuzione.} assegna la CPU
1825 ai vari processi attivi. In particolare prenderemo in esame i vari meccanismi
1826 con cui viene gestita l'assegnazione del tempo di CPU, ed illustreremo le
1827 varie funzioni di gestione.
1828
1829
1830 \subsection{I meccanismi di \textit{scheduling}}
1831 \label{sec:proc_sched}
1832
1833 La scelta di un meccanismo che sia in grado di distribuire in maniera efficace
1834 il tempo di CPU per l'esecuzione dei processi è sempre una questione delicata,
1835 ed oggetto di numerose ricerche; in ogni caso essa dipende in maniera
1836 essenziale anche dal tipo di utilizzo che deve essere fatto del sistema.
1837
1838 Si tenga presente comunque che l'utilizzo della CPU è soltanto una delle
1839 risorse (insieme alla memoria e all'accesso alle periferiche) che sono
1840 necessarie per l'esecuzione di un programma, e spesso non è neanche la più
1841 importante. Per questo non è affatto detto che dare ad un programma la massima
1842 priorità di esecuzione abbia risultati significativi in termini di
1843 prestazioni.
1844
1845 La caratteristica specifica di un sistema multitasking come Linux è quella del
1846 cosiddetto \textit{prehemptive multitasking}: questo significa che al
1847 contrario di altri sistemi (che usano invece il cosiddetto \textit{cooperative
1848   multitasking}) non sono i singoli processi, ma il kernel stesso a decidere
1849 quando la CPU deve essere passata ad un altro processo. Come accennato in
1850 \secref{sec:proc_hierarchy} questa scelta viene eseguita dallo
1851 \textit{scheduler} il cui scopo è quello di distribuire al meglio il tempo di
1852 CPU fra i vari processi. 
1853
1854 Il Linux un processo può trovarsi in uno degli stati riportati in 
1855
1856
1857
1858 \begin{table}[htb]
1859   \centering
1860   \begin{tabular}[c]{|l|c|p{8cm}|}
1861     \hline
1862     \textbf{Stato} & \texttt{STAT} & \textbf{Descrizione} \\
1863     \hline
1864     \hline
1865     \textbf{Runnable} & \texttt{R} & Il processo è in esecuzione o è pronto ad
1866     essere eseguito (cioè è in attesa che gli venga assegnata la CPU).   \\
1867     \textbf{Sleep} & \texttt{S} & Il processo processo è in attesa di un
1868     risposta dal sistema, ma può essere interrotto da un segnale. \\
1869     \textbf{Uninterrutible Sleep} & \texttt{D} & Il  processo è in
1870     attesa di un risposta dal sistema (in genere per I/O), e non può essere
1871     interrotto in nessuna circostanza. \\
1872     \textbf{Stopped} & \texttt{T} & Il processo è stato fermato con un
1873     \macro{SIGSTOP}, o è tracciato.\\
1874     \textbf{Zombie} & \texttt{Z} & Il processo è terminato ma il suo stato di
1875     terminazione non è ancora stato letto dal padre. \\
1876     \hline
1877   \end{tabular}
1878   \caption{Tabella degli stati possibili per  processo in Linux, si sono
1879     riportati nella colonna \texttt{STAT} i valori dello stato ottenibili
1880     dall'output del comando \cmd{ps}.}
1881   \label{tab:proc_proc_states}
1882 \end{table}
1883
1884
1885
1886
1887 Una delle caratteristiche c
1888
1889 ,\footnote{lo stato di un processo
1890   è riportato nel campo \texttt{STAT} dell'output del comando \cmd{ps},
1891   abbiamo già visto che lo stato di \textit{zombie} è indicato con \texttt{Z},
1892   gli stati \textit{runnable}, \textit{sleep} e di I/O (\textit{uninteruttible
1893     sleep}) sono invece indicati con \texttt{R}, \texttt{S} e \texttt{D}.})
1894 la priorità assoluta viene invece ignorata per quelli che sono bloccati su una
1895 richiesta di I/O o in stato di \textit{sleep}
1896
1897
1898 La cosa è resa ancora più complicata dal fatto che con le architetture
1899 multi-processore si introduce anche la problematica dovuta alla scelta di
1900 quale sia la CPU più opportuna da utilizzare.\footnote{nei processori moderni
1901   la presenza di ampie cache può rendere poco efficiente trasferire
1902   l'esecuzione di un processo da una CPU ad un'altra, per cui occorrono
1903   meccanismi per determinare quale è la migliore scelta fra le diverse CPU.}
1904 Tutto questo comunque appartiene alle sottigliezze dell'implementazione del
1905 kernel, e dal punto di vista dei programmi che girano in user space, anche
1906 quando si hanno più processori (e dei processi che sono eseguiti davvero in
1907 contemporanea), si può pensare alle politiche di scheduling come concernenti
1908 la risorsa \textsl{tempo di esecuzione}, la cui assegnazione sarà governata
1909 dagli stessi meccanismi di scelta di priorità, solo che nel caso di più
1910 processori sarà a disposizione di più di un processo alla volta.
1911
1912
1913
1914
1915 Il meccanismo tradizionale di scheduling di Unix (che tratteremo in
1916 \secref{sec:proc_sched_stand}) è sempre stato basato su delle \textsl{priorità
1917   dinamiche}, in modo da assicurare che tutti i processi, anche i meno
1918 importanti, possano ricevere un po' di tempo di CPU. In sostanza quando un
1919 processo ottiene la CPU la sua priorità viene diminuita. In questo modo alla
1920 fine, anche un processo con priorità iniziale molto bassa, finisce per avere
1921 una priorità sufficiente per essere eseguito.
1922
1923 Lo standard POSIX.1b però ha introdotto il concetto di \textsl{priorità
1924   assoluta}, (chiamata anche \textsl{priorità statica}, in contrapposizione
1925 alla normale priorità dinamica), per tenere conto dei sistemi
1926 real-time,\footnote{per sistema real-time si intende un sistema in grado di
1927   eseguire operazioni in un tempo ben determinato; in genere si tende a
1928   distinguere fra l'\textit{hard real-time} in cui è necessario che i tempi di
1929   esecuzione di un programma siano determinabili con certezza assoluta (come
1930   nel caso di meccanismi di controllo di macchine, dove uno sforamento dei
1931   tempi avrebbe conseguenze disastrose), e \textit{soft-real-time} in cui un
1932   occasionale sforamento è ritenuto accettabile.} in cui è vitale che i
1933 processi che devono essere eseguiti in un determinato momento non debbano
1934 aspettare la conclusione di altri che non hanno questa necessità.
1935
1936 Il concetto di priorità assoluta dice che quando due processi si contendono
1937 l'esecuzione, vince sempre quello con la priorità assoluta più alta, anche
1938 quando l'altro è in esecuzione (grazie al \textit{prehemptive scheduling}).
1939 Ovviamente questo avviene solo per i processi che sono pronti per essere
1940 eseguiti (cioè nello stato \textit{runnable}).  La priorità assoluta viene in
1941 genere indicata con un numero intero, ed un valore più alto comporta una
1942 priorità maggiore. Su questa politica di scheduling torneremo in
1943 \secref{sec:proc_real_time}.
1944
1945 In generale quello che succede in tutti gli Unix moderni è che ai processi
1946 normali viene sempre data una priorità assoluta pari a zero, e la decisione di
1947 assegnazione della CPU è fatta solo in base ad una priorità dinamica che è
1948 calcolata indipendentemente. È tuttavia possibile assegnare anche una priorità
1949 assoluta nel qual caso un processo avrà la precedenza su tutti gli altri di
1950 priorità inferiore che saranno eseguiti solo quando quest'ultimo non avrà
1951 bisogno della CPU.
1952
1953 \subsection{Il meccanismo di \textit{scheduling} standard}
1954 \label{sec:proc_sched_stand}
1955
1956 A meno che non si abbiano esigenze specifiche, l'unico meccanismo di
1957 scheduling con il quale si avrà a che fare è quello tradizionale, che prevede
1958 solo priorità dinamiche. È di questo che, di norma, ci si dovrà preoccupare
1959 nella programmazione.
1960
1961 Come accennato in Linux tutti i processi ordinari hanno la stessa priorità
1962 assoluta. Quello che determina quale, fra tutti i processi in attesa di
1963 esecuzione, sarà eseguito per primo, è la priorità dinamica, che è chiamata
1964 così proprio perché varia nel corso dell'esecuzione di un processo. Oltre a
1965 questo la priorità dinamica determina quanto a lungo un processo continuerà ad
1966 essere eseguito, e quando un processo potrà subentrare ad un altro
1967 nell'esecuzione.
1968
1969
1970
1971
1972 \subsection{Il meccanismo di \textit{scheduling real-time}}
1973 \label{sec:proc_real_time}
1974
1975 Per settare le 
1976
1977
1978 \footnote{a meno che non si siano installate le patch di RTLinux o RTAI, con i
1979   quali è possibile ottenere un sistema effettivamente hard real-time.}
1980
1981 in realtà non si tratta di un vero hard real-time, in quanto
1982   la presenza di eventuali interrupt o di page fault può sempre interrompere
1983   l'esecuzione di un processo, a meno di non installare le estensioni di
1984   RTLinux o RTAI, il normale kernel non è real-time.
1985
1986
1987
1988
1989
1990 \section{Problematiche di programmazione multitasking}
1991 \label{sec:proc_multi_prog}
1992
1993 Benché i processi siano strutturati in modo da apparire il più possibile come
1994 indipendenti l'uno dall'altro, nella programmazione in un sistema multitasking
1995 occorre tenere conto di una serie di problematiche che normalmente non
1996 esistono quando si ha a che fare con un sistema in cui viene eseguito un solo
1997 programma alla volta.
1998
1999 Pur essendo questo argomento di carattere generale, ci è parso opportuno
2000 introdurre sinteticamente queste problematiche, che ritroveremo a più riprese
2001 in capitoli successivi, in questa sezione conclusiva del capitolo in cui
2002 abbiamo affrontato la gestione dei processi.
2003
2004
2005 \subsection{Le operazioni atomiche}
2006 \label{sec:proc_atom_oper}
2007
2008 La nozione di \textsl{operazione atomica} deriva dal significato greco della
2009 parola atomo, cioè indivisibile; si dice infatti che un'operazione è atomica
2010 quando si ha la certezza che, qualora essa venga effettuata, tutti i passaggi
2011 che devono essere compiuti per realizzarla verranno eseguiti senza possibilità
2012 di interruzione in una fase intermedia.
2013
2014 In un ambiente multitasking il concetto è essenziale, dato che un processo può
2015 essere interrotto in qualunque momento dal kernel che mette in esecuzione un
2016 altro processo o dalla ricezione di un segnale; occorre pertanto essere
2017 accorti nei confronti delle possibili \textit{race condition} (vedi
2018 \secref{sec:proc_race_cond}) derivanti da operazioni interrotte in una fase in
2019 cui non erano ancora state completate.
2020
2021 Nel caso dell'interazione fra processi la situazione è molto più semplice, ed
2022 occorre preoccuparsi della atomicità delle operazioni solo quando si ha a che
2023 fare con meccanismi di intercomunicazione (che esamineremo in dettaglio in
2024 \capref{cha:IPC}) o nelle operazioni con i file (vedremo alcuni esempi in
2025 \secref{sec:file_atomic}). In questi casi in genere l'uso delle appropriate
2026 funzioni di libreria per compiere le operazioni necessarie è garanzia
2027 sufficiente di atomicità in quanto le system call con cui esse sono realizzate
2028 non possono essere interrotte (o subire interferenze pericolose) da altri
2029 processi.
2030
2031 Nel caso dei segnali invece la situazione è molto più delicata, in quanto lo
2032 stesso processo, e pure alcune system call, possono essere interrotti in
2033 qualunque momento, e le operazioni di un eventuale \textit{signal handler}
2034 sono compiute nello stesso spazio di indirizzi del processo. Per questo, anche
2035 il solo accesso o l'assegnazione di una variabile possono non essere più
2036 operazioni atomiche (torneremo su questi aspetti in
2037 \secref{sec:sign_control}).
2038
2039 In questo caso il sistema provvede un tipo di dato, il \type{sig\_atomic\_t},
2040 il cui accesso è assicurato essere atomico.  In pratica comunque si può
2041 assumere che, in ogni piattaforma su cui è implementato Linux, il tipo
2042 \type{int}, gli altri interi di dimensione inferiore ed i puntatori sono
2043 atomici. Non è affatto detto che lo stesso valga per interi di dimensioni
2044 maggiori (in cui l'accesso può comportare più istruzioni in assembler) o per
2045 le strutture. In tutti questi casi è anche opportuno marcare come
2046 \type{volatile} le variabili che possono essere interessate ad accesso
2047 condiviso, onde evitare problemi con le ottimizzazioni del codice.
2048
2049
2050 \subsection{Le \textit{race condition} e i \textit{deadlock}}
2051 \label{sec:proc_race_cond}
2052
2053 Si definiscono \textit{race condition} tutte quelle situazioni in cui processi
2054 diversi operano su una risorsa comune, ed in cui il risultato viene a
2055 dipendere dall'ordine in cui essi effettuano le loro operazioni. Il caso
2056 tipico è quello di un'operazione che viene eseguita da un processo in più
2057 passi, e può essere compromessa dall'intervento di un altro processo che
2058 accede alla stessa risorsa quando ancora non tutti i passi sono stati
2059 completati.
2060
2061 Dato che in un sistema multitasking ogni processo può essere interrotto in
2062 qualunque momento per farne subentrare un'altro in esecuzione, niente può
2063 assicurare un preciso ordine di esecuzione fra processi diversi o che una
2064 sezione di un programma possa essere eseguita senza interruzioni da parte di
2065 altri. Queste situazioni comportano pertanto errori estremamente subdoli e
2066 difficili da tracciare, in quanto nella maggior parte dei casi tutto
2067 funzionerà regolarmente, e solo occasionalmente si avranno degli errori. 
2068
2069 Per questo occorre essere ben consapevoli di queste problematiche, e del fatto
2070 che l'unico modo per evitarle è quello di riconoscerle come tali e prendere
2071 gli adeguati provvedimenti per far si che non si verifichino. Casi tipici di
2072 \textit{race condition} si hanno quando diversi processi accedono allo stesso
2073 file, o nell'accesso a meccanismi di intercomunicazione come la memoria
2074 condivisa. In questi casi, se non si dispone della possibilità di eseguire
2075 atomicamente le operazioni necessarie, occorre che quelle parti di codice in
2076 cui si compiono le operazioni sulle risorse condivise (le cosiddette
2077 \textsl{sezioni critiche}) del programma, siano opportunamente protette da
2078 meccanismi di sincronizzazione (torneremo su queste problematiche di questo
2079 tipo in \secref{sec:ipc_semaph}).
2080
2081 Un caso particolare di \textit{race condition} sono poi i cosiddetti
2082 \textit{deadlock}, particolarmente gravi in quanto comportano spesso il blocco
2083 completo di un servizio, e non il fallimento di una singola operazione.
2084 L'esempio tipico di una situazione che può condurre ad un \textit{deadlock} è
2085 quello in cui un flag di ``occupazione'' viene rilasciato da un evento
2086 asincrono (come un segnale o un altro processo) fra il momento in cui lo si è
2087 controllato (trovandolo occupato) e la successiva operazione di attesa per lo
2088 sblocco. In questo caso, dato che l'evento di sblocco del flag è avvenuto
2089 senza che ce ne accorgessimo proprio fra il controllo e la messa in attesa,
2090 quest'ultima diventerà perpetua (da cui il nome di \textit{deadlock}).
2091
2092 In tutti questi casi è di fondamentale importanza il concetto di atomicità
2093 visto in \secref{sec:proc_atom_oper}; questi problemi infatti possono essere
2094 risolti soltanto assicurandosi, quando essa sia richiesta, che sia possibile
2095 eseguire in maniera atomica le operazioni necessarie.
2096
2097
2098 \subsection{Le funzioni rientranti}
2099 \label{sec:proc_reentrant}
2100
2101 Si dice \textsl{rientrante} una funzione che può essere interrotta in
2102 qualunque punto della sua esecuzione ed essere chiamata una seconda volta da
2103 un altro thread di esecuzione senza che questo comporti nessun problema
2104 nell'esecuzione della stessa. La problematica è comune nella programmazione
2105 multi-thread, ma si hanno gli stessi problemi quando si vogliono chiamare
2106 delle funzioni all'interno dei manipolatori dei segnali.
2107
2108 Fintanto che una funzione opera soltanto con le variabili locali è rientrante;
2109 queste infatti vengono allocate nello stack, e un'altra invocazione non fa
2110 altro che allocarne un'altra copia. Una funzione può non essere rientrante
2111 quando opera su memoria che non è nello stack.  Ad esempio una funzione non è
2112 mai rientrante se usa una variabile globale o statica.
2113
2114 Nel caso invece la funzione operi su un oggetto allocato dinamicamente, la
2115 cosa viene a dipendere da come avvengono le operazioni: se l'oggetto è creato
2116 ogni volta e ritornato indietro la funzione può essere rientrante, se invece
2117 esso viene individuato dalla funzione stessa, due chiamate alla stessa
2118 funzione potranno interferire quando entrambe faranno riferimento allo stesso
2119 oggetto.  Allo stesso modo una funzione può non essere rientrante se usa e
2120 modifica un oggetto che le viene fornito dal chiamante: due chiamate possono
2121 interferire se viene passato lo stesso oggetto; in tutti questi casi occorre
2122 molta cura da parte del programmatore.
2123
2124 In genere le funzioni di libreria non sono rientranti, molte di esse ad
2125 esempio utilizzano variabili statiche, le \acr{glibc} però mettono a
2126 disposizione due macro di compilatore, \macro{\_REENTRANT} e
2127 \macro{\_THREAD\_SAFE}, la cui definizione attiva le versioni rientranti di
2128 varie funzioni di libreria, che sono identificate aggiungendo il suffisso
2129 \code{\_r} al nome della versione normale.
2130
2131
2132
2133 %%% Local Variables: 
2134 %%% mode: latex
2135 %%% TeX-master: "gapil"
2136 %%% End: