Corretta figura e sistemata la footnote su chi parte prima dopo una fork
[gapil.git] / prochand.tex
index adf67a3052c38bf7512bbc7ce417055a3b98de5d..70d7eb1d2e90ce7d0fd54c5b4f30b6eb6efb4483 100644 (file)
@@ -25,7 +25,7 @@ caratteristiche, dando una panoramica sull'uso delle principali funzioni di
 gestione.
 
 
 gestione.
 
 
-\subsection{La gerarchia dei processi}
+\subsection{L'architettura della gestione dei processi}
 \label{sec:proc_hierarchy}
 
 A differenza di quanto avviene in altri sistemi (ad esempio nel VMS la
 \label{sec:proc_hierarchy}
 
 A differenza di quanto avviene in altri sistemi (ad esempio nel VMS la
@@ -109,12 +109,46 @@ Dato che tutti i processi attivi nel sistema sono comunque generati da
   kernel, (come \cmd{keventd}, \cmd{kswapd}, etc.)} si possono classificare i
 processi con la relazione padre/figlio in una organizzazione gerarchica ad
 albero, in maniera analoga a come i file sono organizzati in un albero di
   kernel, (come \cmd{keventd}, \cmd{kswapd}, etc.)} si possono classificare i
 processi con la relazione padre/figlio in una organizzazione gerarchica ad
 albero, in maniera analoga a come i file sono organizzati in un albero di
-directory (si veda \secref{sec:file_file_struct}); in \curfig\ si è mostrato il
-risultato del comando \cmd{pstree} che permette di mostrare questa struttura,
-alla cui base c'è \cmd{init} che è progenitore di tutti gli altri processi.
+directory (si veda \secref{sec:file_organization}); in \curfig\ si è mostrato
+il risultato del comando \cmd{pstree} che permette di mostrare questa
+struttura, alla cui base c'è \cmd{init} che è progenitore di tutti gli altri
+processi.
+
+
+Il kernel mantiene una tabella dei processi attivi, la cosiddetta
+\textit{process table}; per ciascun processo viene mantenuta una voce nella
+tabella dei processi costituita da una struttura \type{task\_struct}, che
+contiene tutte le informazioni rilevanti per quel processo. Tutte le strutture
+usate a questo scopo sono dichiarate nell'header file \file{linux/sched.h}, ed
+uno schema semplificato che riporta la struttura delle principali informazioni
+contenute nella \type{task\_struct} (che in seguito incontreremo a più
+riprese), è mostrato in \nfig.
+
+\begin{figure}[htb]
+  \centering
+  \includegraphics[width=13cm]{img/task_struct}
+  \caption{Schema semplificato dell'architettura delle strutture usate dal
+    kernel nella gestione dei processi.}
+  \label{fig:proc_task_struct}
+\end{figure}
+
+
+Come accennato in \secref{sec:intro_unix_struct} è lo \textit{scheduler} che
+decide quale processo mettere in esecuzione; esso viene eseguito ad ogni
+system call ed ad ogni interrupt, (ma può essere anche attivato
+esplicitamente). Il timer di sistema provvede comunque a che esso sia invocato
+periodicamente, generando un interrupt periodico secondo la frequenza
+specificata dalla costante \macro{HZ}, definita in \file{asm/param.h} Il
+valore usuale è 100 (è espresso in Hertz), si ha cioè un interrupt dal timer
+ogni centesimo di secondo.
 
 
+Ogni volta che viene eseguito, lo \textit{scheduler} effettua il calcolo delle
+priorità dei vari processi attivi (torneremo su questo in
+\secref{sec:proc_priority}) e stabilisce quale di essi debba essere posto in
+esecuzione fino alla successiva invocazione.
 
 
-\subsection{Una panoramica sulle funzioni di gestione}
+
+\subsection{Una panoramica sulle funzioni fondamentali}
 \label{sec:proc_handling_intro}
 
 I processi vengono creati dalla funzione \func{fork}; in molti unix questa è
 \label{sec:proc_handling_intro}
 
 I processi vengono creati dalla funzione \func{fork}; in molti unix questa è
@@ -160,15 +194,15 @@ non ritorna mai (in quanto con essa viene eseguito un altro programma).
 
 
 
 
 
 
-\section{La gestione dei processi}
+\section{Le funzioni di base}% della gestione dei processi}
 \label{sec:proc_handling}
 
 In questa sezione tratteremo le problematiche della gestione dei processi
 all'interno del sistema, illustrandone tutti i dettagli.  Inizieremo con le
 funzioni elementari che permettono di leggerne gli identificatori, per poi
 \label{sec:proc_handling}
 
 In questa sezione tratteremo le problematiche della gestione dei processi
 all'interno del sistema, illustrandone tutti i dettagli.  Inizieremo con le
 funzioni elementari che permettono di leggerne gli identificatori, per poi
-passare alla spiegazione delle funzioni fondamentali che si usano per la
-creazione e la terminazione dei processi, e per la messa in esecuzione degli
-altri programmi.
+passare alla spiegazione delle funzioni base che si usano per la creazione e
+la terminazione dei processi, e per la messa in esecuzione degli altri
+programmi.
 
 
 \subsection{Gli identificatori dei processi}
 
 
 \subsection{Gli identificatori dei processi}
@@ -403,15 +437,16 @@ Go to next child
 
 Esaminiamo questo risultato: una prima conclusione che si può trarre è non si
 può dire quale processo fra il padre ed il figlio venga eseguito per
 
 Esaminiamo questo risultato: una prima conclusione che si può trarre è non si
 può dire quale processo fra il padre ed il figlio venga eseguito per
-primo\footnote{anche se nel kernel 2.4.x era stato introdotto un meccanismo
-  che metteva in esecuzione sempre il xxx per primo (TODO recuperare le
-  informazioni esatte)} dopo la chiamata a \func{fork}; dall'esempio si può
-notare infatti come nei primi due cicli sia stato eseguito per primo il padre
-(con la stampa del \acr{pid} del nuovo processo) per poi passare
-all'esecuzione del figlio (completata con i due avvisi di esecuzione ed
-uscita), e tornare all'esecuzione del padre (con la stampa del passaggio al
-ciclo successivo), mentre la terza volta è stato prima eseguito il figlio
-(fino alla conclusione) e poi il padre.
+primo\footnote{a partire dal kernel 2.5.2-pre10 è stato introdotto il nuovo
+  scheduler di Ingo Molnar che esegue sempre per primo il figlio; per
+  mantenere la portabilità è opportuno non fare comunque affidamento su questo
+  comportamento} dopo la chiamata a \func{fork}; dall'esempio si può notare
+infatti come nei primi due cicli sia stato eseguito per primo il padre (con la
+stampa del \acr{pid} del nuovo processo) per poi passare all'esecuzione del
+figlio (completata con i due avvisi di esecuzione ed uscita), e tornare
+all'esecuzione del padre (con la stampa del passaggio al ciclo successivo),
+mentre la terza volta è stato prima eseguito il figlio (fino alla conclusione)
+e poi il padre.
 
 In generale l'ordine di esecuzione dipenderà, oltre che dall'algoritmo di
 scheduling usato dal kernel, dalla particolare situazione in si trova la
 
 In generale l'ordine di esecuzione dipenderà, oltre che dall'algoritmo di
 scheduling usato dal kernel, dalla particolare situazione in si trova la
@@ -551,11 +586,10 @@ comune dopo l'esecuzione di una \func{fork} 
 \item gli identificatori per il controllo di accesso: il \textit{real user
     id}, il \textit{real group id}, l'\textit{effective user id},
   l'\textit{effective group id} ed i \textit{supplementary group id} (vedi
 \item gli identificatori per il controllo di accesso: il \textit{real user
     id}, il \textit{real group id}, l'\textit{effective user id},
   l'\textit{effective group id} ed i \textit{supplementary group id} (vedi
-  \secref{sec:proc_user_group}).
+  \secref{sec:proc_access_id}).
 \item gli identificatori per il controllo di sessione: il \textit{process
     group id} e il \textit{session id} ed il terminale di controllo (vedi
   \secref{sec:sess_xxx} e \secref{sec:sess_xxx}).
 \item gli identificatori per il controllo di sessione: il \textit{process
     group id} e il \textit{session id} ed il terminale di controllo (vedi
   \secref{sec:sess_xxx} e \secref{sec:sess_xxx}).
-\item i flag di \acr{suid} e \acr{sgid} (vedi \secref{sec:file_suid_sgid}).
 \item la directory di lavoro e la directory radice (vedi
   \secref{sec:file_work_dir} e \secref{sec:file_chroot}).
 \item la maschera dei permessi di creazione (vedi \secref{sec:file_umask}).
 \item la directory di lavoro e la directory radice (vedi
   \secref{sec:file_work_dir} e \secref{sec:file_chroot}).
 \item la maschera dei permessi di creazione (vedi \secref{sec:file_umask}).
@@ -792,13 +826,11 @@ prototipo 
 Sospende il processo corrente finché un figlio non è uscito, o finché un
 segnale termina il processo o chiama una funzione di gestione. 
 
 Sospende il processo corrente finché un figlio non è uscito, o finché un
 segnale termina il processo o chiama una funzione di gestione. 
 
-\bodydesc{
-La funzione restituisce il \acr{pid} del figlio in caso di successo e -1 in
-caso di errore; \var{errno} può assumere i valori:
+\bodydesc{La funzione restituisce il \acr{pid} del figlio in caso di successo
+  e -1 in caso di errore; \var{errno} può assumere i valori:
   \begin{errlist}
   \item[\macro{EINTR}] la funzione è stata interrotta da un segnale.
   \begin{errlist}
   \item[\macro{EINTR}] la funzione è stata interrotta da un segnale.
-  \end{errlist}
-}
+  \end{errlist}}
 \end{functions}
 \noindent
 è presente fin dalle prime versioni di unix; la funzione ritorna non appena un
 \end{functions}
 \noindent
 è presente fin dalle prime versioni di unix; la funzione ritorna non appena un
@@ -980,38 +1012,9 @@ definendo la costante \macro{\_USE\_BSD}, sono:
 \end{functions}
 \noindent 
 la struttura \type{rusage} è definita in \file{sys/resource.h}, e viene
 \end{functions}
 \noindent 
 la struttura \type{rusage} è definita in \file{sys/resource.h}, e viene
-utilizzata anche dalla funzione \func{getrusage} per ottenere le risorse di
-sistema usate dal processo; la sua definizione è riportata in \nfig.
-\begin{figure}[!htb]
-  \footnotesize
-  \centering
-  \begin{minipage}[c]{15cm}
-    \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
-struct rusage {
-     struct timeval ru_utime; /* user time used */
-     struct timeval ru_stime; /* system time used */
-     long ru_maxrss;          /* maximum resident set size */
-     long ru_ixrss;           /* integral shared memory size */
-     long ru_idrss;           /* integral unshared data size */
-     long ru_isrss;           /* integral unshared stack size */
-     long ru_minflt;          /* page reclaims */
-     long ru_majflt;          /* page faults */
-     long ru_nswap;           /* swaps */
-     long ru_inblock;         /* block input operations */
-     long ru_oublock;         /* block output operations */
-     long ru_msgsnd;          /* messages sent */
-     long ru_msgrcv;          /* messages received */
-     long ru_nsignals;   ;    /* signals received */
-     long ru_nvcsw;           /* voluntary context switches */
-     long ru_nivcsw;          /* involuntary context switches */
-};
-    \end{lstlisting}
-  \end{minipage} 
-  \normalsize 
-  \caption{La struttura \var{rusage} per la lettura delle informazioni dei 
-    delle risorse usate da un processo.}
-  \label{fig:proc_rusage_struct}
-\end{figure}
+utilizzata anche dalla funzione \func{getrusage} (vedi \secref{sec:sys_xxx})
+per ottenere le risorse di sistema usate dal processo; la sua definizione è
+riportata in \figref{fig:sys_rusage_struct}.
 
 In genere includere esplicitamente \file{<sys/time.h>} non è più
 necessario, ma aumenta la portabilità, e serve in caso si debba accedere
 
 In genere includere esplicitamente \file{<sys/time.h>} non è più
 necessario, ma aumenta la portabilità, e serve in caso si debba accedere
@@ -1177,12 +1180,12 @@ Oltre a mantenere lo stesso \acr{pid}, il nuovo programma fatto partire da
 \func{exec} assume anche una serie di altre proprietà del processo chiamante;
 la lista completa è la seguente:
 \begin{itemize*}
 \func{exec} assume anche una serie di altre proprietà del processo chiamante;
 la lista completa è la seguente:
 \begin{itemize*}
-\item il \textit{process ID} (\acr{pid}) ed il \textit{parent process ID}
+\item il \textit{process id} (\acr{pid}) ed il \textit{parent process id}
   (\acr{ppid}).
   (\acr{ppid}).
-\item il \textit{real user ID} ed il \textit{real group ID} (vedi
-  \secref{sec:proc_user_group}).
-\item i \textit{supplementary group ID} (vedi \secref{sec:proc_user_group}).
-\item il \textit{session ID} ed il \textit{process group ID} (vedi
+\item il \textit{real user id} ed il \textit{real group id} (vedi
+  \secref{sec:proc_access_id}).
+\item i \textit{supplementary group id} (vedi \secref{sec:proc_access_id}).
+\item il \textit{session id} ed il \textit{process group id} (vedi
   \secref{sec:sess_xxx}).
 \item il terminale di controllo (vedi \secref{sec:sess_xxx}).
 \item il tempo restante ad un allarme (vedi \secref{sec:sig_xxx}).
   \secref{sec:sess_xxx}).
 \item il terminale di controllo (vedi \secref{sec:sess_xxx}).
 \item il tempo restante ad un allarme (vedi \secref{sec:sig_xxx}).
@@ -1218,12 +1221,12 @@ attraverso una \func{exec}, in genere questo 
 settaggio del flag di \textit{close-on-exec} sulle directory che apre, in
 maniera trasparente all'utente.
 
 settaggio del flag di \textit{close-on-exec} sulle directory che apre, in
 maniera trasparente all'utente.
 
-Abbiamo detto che il \textit{real user ID} ed il \textit{real group ID}
+Abbiamo detto che il \textit{real user id} ed il \textit{real group id}
 restano gli stessi all'esecuzione di \func{exec}; lo stesso vale per
 restano gli stessi all'esecuzione di \func{exec}; lo stesso vale per
-l'\textit{effective user ID} ed l'\textit{effective group ID}, tranne il caso
+l'\textit{effective user id} ed l'\textit{effective group id}, tranne il caso
 in cui il file che si va ad eseguire ha o il \acr{suid} bit o lo \acr{sgid}
 in cui il file che si va ad eseguire ha o il \acr{suid} bit o lo \acr{sgid}
-bit settato, nel qual caso \textit{effective user ID} e \textit{effective
-  group ID} vengono settati rispettivamente all'utente o al gruppo cui il file
+bit settato, nel qual caso \textit{effective user id} e \textit{effective
+  group id} vengono settati rispettivamente all'utente o al gruppo cui il file
 appartiene (per i dettagli vedi \secref{sec:proc_perms}).
 
 Se il file da eseguire è in formato \emph{a.out} e necessita di librerie
 appartiene (per i dettagli vedi \secref{sec:proc_perms}).
 
 Se il file da eseguire è in formato \emph{a.out} e necessita di librerie
@@ -1258,8 +1261,8 @@ nuovi processi, e le varie funzioni per la loro manipolazione diretta e tutte
 le problematiche connesse ad una gestione accorta dei privilegi.
 
 
 le problematiche connesse ad una gestione accorta dei privilegi.
 
 
-\subsection{Utente e gruppo di un processo}
-\label{sec:proc_user_group}
+\subsection{Gli identificatori del controllo di accesso}
+\label{sec:proc_access_id}
 
 Come accennato in \secref{sec:intro_multiuser} il modello base\footnote{in
   realtà già esistono estensioni di questo modello base, che lo rendono più
 
 Come accennato in \secref{sec:intro_multiuser} il modello base\footnote{in
   realtà già esistono estensioni di questo modello base, che lo rendono più
@@ -1329,8 +1332,8 @@ identificatori, chiamati rispettivamente \textit{real} ed \textit{effective}.
   \label{tab:proc_uid_gid}
 \end{table}
 
   \label{tab:proc_uid_gid}
 \end{table}
 
-Al primo gruppo appartengono il \textit{real user ID} e il \textit{real group
-  ID}: questi vengono settati al login ai valori corrispondenti all'utente con
+Al primo gruppo appartengono il \textit{real user id} e il \textit{real group
+  id}: questi vengono settati al login ai valori corrispondenti all'utente con
 cui si accede al sistema (e relativo gruppo di default). Servono per
 l'identificazione dell'utente e normalmente non vengono mai cambiati. In
 realtà vedremo (in \secref{sec:proc_setuid}) che è possibile modificarli, ma
 cui si accede al sistema (e relativo gruppo di default). Servono per
 l'identificazione dell'utente e normalmente non vengono mai cambiati. In
 realtà vedremo (in \secref{sec:proc_setuid}) che è possibile modificarli, ma
@@ -1339,8 +1342,8 @@ possibilit
 procedura di autenticazione lancia una shell per la quale setta questi
 identificatori ai valori corrispondenti all'utente che entra nel sistema.
 
 procedura di autenticazione lancia una shell per la quale setta questi
 identificatori ai valori corrispondenti all'utente che entra nel sistema.
 
-Al secondo gruppo appartengono l'\textit{effective user ID} e
-l'\textit{effective group ID} (a cui si aggiungono gli eventuali
+Al secondo gruppo appartengono l'\textit{effective user id} e
+l'\textit{effective group id} (a cui si aggiungono gli eventuali
 \textit{supplementary group id} dei gruppi dei quale l'utente fa parte).
 Questi sono invece gli identificatori usati nella verifiche dei permessi del
 processo e per il controllo di accesso ai file (argomento affrontato in
 \textit{supplementary group id} dei gruppi dei quale l'utente fa parte).
 Questi sono invece gli identificatori usati nella verifiche dei permessi del
 processo e per il controllo di accesso ai file (argomento affrontato in
@@ -1361,16 +1364,16 @@ prototipi sono i seguenti:
 \begin{functions}
   \headdecl{unistd.h}
   \headdecl{sys/types.h}  
 \begin{functions}
   \headdecl{unistd.h}
   \headdecl{sys/types.h}  
-  \funcdecl{uid\_t getuid(void)} Restituisce il \textit{real user ID} del
+  \funcdecl{uid\_t getuid(void)} Restituisce il \textit{real user id} del
   processo corrente.
 
   processo corrente.
 
-  \funcdecl{uid\_t geteuid(void)} Restituisce l'\textit{effective user ID} del
+  \funcdecl{uid\_t geteuid(void)} Restituisce l'\textit{effective user id} del
   processo corrente.
 
   processo corrente.
 
-  \funcdecl{gid\_t getgid(void)} Restituisce il \textit{real group ID} del
+  \funcdecl{gid\_t getgid(void)} Restituisce il \textit{real group id} del
   processo corrente.
 
   processo corrente.
 
-  \funcdecl{gid\_t getegid(void)} Restituisce l'\textit{effective group ID} del
+  \funcdecl{gid\_t getegid(void)} Restituisce l'\textit{effective group id} del
   processo corrente.
   
   \bodydesc{Queste funzioni non riportano condizioni di errore.}
   processo corrente.
   
   \bodydesc{Queste funzioni non riportano condizioni di errore.}
@@ -1421,7 +1424,7 @@ di utente e gruppo associati dal kernel ad ogni processo, 
 
 Le due funzioni che vengono usate per cambiare identità (cioè utente e gruppo
 di appartenenza) ad un processo sono rispettivamente \func{setuid} e
 
 Le due funzioni che vengono usate per cambiare identità (cioè utente e gruppo
 di appartenenza) ad un processo sono rispettivamente \func{setuid} e
-\func{setgid}; come accennato in \secref{sec:proc_user_group} in Linux esse
+\func{setgid}; come accennato in \secref{sec:proc_access_id} in Linux esse
 seguono la semantica POSIX che prevede l'esistenza del \textit{saved user id}
 e del \textit{saved group id}; i loro prototipi sono:
 \begin{functions}
 seguono la semantica POSIX che prevede l'esistenza del \textit{saved user id}
 e del \textit{saved group id}; i loro prototipi sono:
 \begin{functions}
@@ -1528,11 +1531,11 @@ e \textit{real id}. I loro prototipi sono:
 \headdecl{sys/types.h}
 
 \funcdecl{int setreuid(uid\_t ruid, uid\_t euid)} Setta il \textit{real user
 \headdecl{sys/types.h}
 
 \funcdecl{int setreuid(uid\_t ruid, uid\_t euid)} Setta il \textit{real user
-  ID} e l'\textit{effective user ID} del processo corrente ai valori
+  id} e l'\textit{effective user id} del processo corrente ai valori
 specificati da \var{ruid} e \var{euid}.
   
 \funcdecl{int setregid(gid\_t rgid, gid\_t egid)} Setta il \textit{real group
 specificati da \var{ruid} e \var{euid}.
   
 \funcdecl{int setregid(gid\_t rgid, gid\_t egid)} Setta il \textit{real group
-  ID} e l'\textit{effective group ID} del processo corrente ai valori
+  id} e l'\textit{effective group id} del processo corrente ai valori
 specificati da \var{rgid} e \var{egid}.
 
 \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso
 specificati da \var{rgid} e \var{egid}.
 
 \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso
@@ -1571,6 +1574,34 @@ identificatori ad un valore diverso dal \textit{real id} precedente, il
 \textit{saved id} viene sempre settato al valore dell'\textit{effective id}.
 
 
 \textit{saved id} viene sempre settato al valore dell'\textit{effective id}.
 
 
+
+\subsection{Le funzioni \func{seteuid} e \func{setegid}}
+\label{sec:proc_seteuid}
+
+Queste funzioni sono un'estensione allo standard POSIX.1 (ma sono comunque
+supportate dalla maggior parte degli Unix) e usate per cambiare gli
+\textit{effective id}; i loro prototipi sono:
+\begin{functions}
+\headdecl{unistd.h}
+\headdecl{sys/types.h}
+
+\funcdecl{int seteuid(uid\_t uid)} Setta l'\textit{effective user id} del
+processo corrente a \var{uid}.
+
+\funcdecl{int setegid(gid\_t gid)} Setta l'\textit{effective group id} del
+processo corrente a \var{gid}.
+
+\bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso
+  di fallimento: l'unico errore possibile è \macro{EPERM}.}
+\end{functions}
+
+Gli utenti normali possono settare l'\textit{effective id} solo al valore del
+\textit{real id} o del \textit{saved id}, l'amministratore può specificare
+qualunque valore. Queste funzioni sono usate per permettere a root di settare
+solo l'\textit{effective id}, dato che l'uso normale di \func{setuid} comporta
+il settaggio di tutti gli identificatori.
+
 \subsection{Le funzioni \func{setresuid} e \func{setresgid}}
 \label{sec:proc_setresuid}
 
 \subsection{Le funzioni \func{setresuid} e \func{setresgid}}
 \label{sec:proc_setresuid}
 
@@ -1582,13 +1613,13 @@ e permettono un completo controllo su tutti gli identificatori (\textit{real},
 \headdecl{sys/types.h}
 
 \funcdecl{int setresuid(uid\_t ruid, uid\_t euid, uid\_t suid)} Setta il
 \headdecl{sys/types.h}
 
 \funcdecl{int setresuid(uid\_t ruid, uid\_t euid, uid\_t suid)} Setta il
-\textit{real user ID}, l'\textit{effective user ID} e il \textit{saved user
-  ID} del processo corrente ai valori specificati rispettivamente da
+\textit{real user id}, l'\textit{effective user id} e il \textit{saved user
+  id} del processo corrente ai valori specificati rispettivamente da
 \var{ruid}, \var{euid} e \var{suid}.
   
 \funcdecl{int setresgid(gid\_t rgid, gid\_t egid, gid\_t sgid)} Setta il
 \var{ruid}, \var{euid} e \var{suid}.
   
 \funcdecl{int setresgid(gid\_t rgid, gid\_t egid, gid\_t sgid)} Setta il
-\textit{real group ID}, l'\textit{effective group ID} e il \textit{saved group
-  ID} del processo corrente ai valori specificati rispettivamente da
+\textit{real group id}, l'\textit{effective group id} e il \textit{saved group
+  id} del processo corrente ai valori specificati rispettivamente da
 \var{rgid}, \var{egid} e \var{sgid}.
 
 \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso
 \var{rgid}, \var{egid} e \var{sgid}.
 
 \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso
@@ -1601,41 +1632,39 @@ identificatori usando uno qualunque dei valori correnti di \textit{real id},
 valori che vuole; un valore di -1 per un qualunque parametro lascia inalterato
 l'identificatore corrispondente.
 
 valori che vuole; un valore di -1 per un qualunque parametro lascia inalterato
 l'identificatore corrispondente.
 
-
-
-\subsection{Le funzioni \func{seteuid} e \func{setegid}}
-\label{sec:proc_seteuid}
-
-Queste funzioni sono un'estensione allo standard POSIX.1 (ma sono comunque
-supportate dalla maggior parte degli Unix) e usate per cambiare gli
-\textit{effective id}; i loro prototipi sono:
+Per queste funzioni esistono anche due controparti che permettono di leggere
+in blocco i vari identificatori: \func{getresuid} e \func{getresgid}; i loro
+prototipi sono: 
 \begin{functions}
 \headdecl{unistd.h}
 \headdecl{sys/types.h}
 
 \begin{functions}
 \headdecl{unistd.h}
 \headdecl{sys/types.h}
 
-\funcdecl{int seteuid(uid\_t uid)} Setta l'\textit{effective user ID} del
-processo corrente a \var{uid}.
-
-\funcdecl{int setegid(gid\_t gid)} Setta l'\textit{effective group ID} del
-processo corrente a \var{gid}.
+\funcdecl{int getresuid(uid\_t *ruid, uid\_t *euid, uid\_t *suid)} Legge il
+\textit{real user id}, l'\textit{effective user id} e il \textit{saved user
+  id} del processo corrente.
+  
+\funcdecl{int getresgid(gid\_t *rgid, gid\_t *egid, gid\_t *sgid)} Legge il
+\textit{real group id}, l'\textit{effective group id} e il \textit{saved group
+  id} del processo corrente.
 
 
-\bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso
-  di fallimento: l'unico errore possibile è \macro{EPERM}.}
+\bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso di
+  fallimento: l'unico errore possibile è \macro{EFAULT} se gli indirizzi delle
+  variabili di ritorno non sono validi.}
 \end{functions}
 
 \end{functions}
 
-Gli utenti normali possono settare l'\textit{effective id} solo al valore del
-\textit{real id} o del \textit{saved id}, l'amministratore può specificare
-qualunque valore. Queste funzioni sono usate per permettere a root di settare
-solo l'\textit{effective id}, dato che l'uso normale di \func{setuid} comporta
-il settaggio di tutti gli identificatori.
+Anche queste funzioni sono una estensione specifica di Linux, e non richiedono
+nessun privilegio. I valori sono restituiti negli argomenti, che vanno
+specificati come puntatori (è un'altro esempio di \textit{value result
+  argument}). Si noti che queste funzioni sono le uniche in grado di leggere i
+\textit{saved id}.
+
 
 \subsection{Le funzioni \func{setfsuid} e \func{setfsgid}}
 \label{sec:proc_setfsuid}
 
 Queste funzioni sono usate per settare gli identificatori usati da Linux per
 il controllo dell'accesso ai file. Come già accennato in
 
 \subsection{Le funzioni \func{setfsuid} e \func{setfsgid}}
 \label{sec:proc_setfsuid}
 
 Queste funzioni sono usate per settare gli identificatori usati da Linux per
 il controllo dell'accesso ai file. Come già accennato in
-\secref{sec:proc_user_group} in Linux è definito questo ulteriore gruppo di
+\secref{sec:proc_access_id} in Linux è definito questo ulteriore gruppo di
 identificatori, che di norma sono assolutamente equivalenti agli
 \textit{effective id}, dato che ogni cambiamento di questi ultimi viene
 immediatamente riportato sui \textit{filesystem id}.
 identificatori, che di norma sono assolutamente equivalenti agli
 \textit{effective id}, dato che ogni cambiamento di questi ultimi viene
 immediatamente riportato sui \textit{filesystem id}.
@@ -1658,10 +1687,10 @@ usate se si intendono scrivere programmi portabili; i loro prototipi sono:
 \begin{functions}
 \headdecl{sys/fsuid.h}
 
 \begin{functions}
 \headdecl{sys/fsuid.h}
 
-\funcdecl{int setfsuid(uid\_t fsuid)} Setta il \textit{filesystem user ID} del
+\funcdecl{int setfsuid(uid\_t fsuid)} Setta il \textit{filesystem user id} del
 processo corrente a \var{fsuid}.
 
 processo corrente a \var{fsuid}.
 
-\funcdecl{int setfsgid(gid\_t fsgid)} Setta l'\textit{filesystem group ID} del
+\funcdecl{int setfsgid(gid\_t fsgid)} Setta l'\textit{filesystem group id} del
 processo corrente a \var{fsgid}.
 
 \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso
 processo corrente a \var{fsgid}.
 
 \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso
@@ -1672,23 +1701,130 @@ privilegi di amministratore o, per gli altri utenti, se il valore specificato
 coincide con uno dei \textit{real}, \textit{effective} o \textit{saved id}.
 
 
 coincide con uno dei \textit{real}, \textit{effective} o \textit{saved id}.
 
 
+\subsection{Le funzioni \func{setgroups} e \func{getgroups}}
+\label{sec:proc_setgroups}
+
+Le ultime funzioni che esamineremo sono quelle sono quelle che permettono di
+operare sui gruppi supplementari. Ogni processo può avere fino a
+\macro{NGROUPS\_MAX} gruppi supplementari in aggiunta al gruppo primario,
+questi vengono ereditati dal processo padre e possono essere cambiati con
+queste funzioni.
+
+La funzione che permette di leggere i gruppi supplementari è \func{getgroups};
+questa funzione è definita nello standard POSIX ed il suo prototipo è:
+\begin{functions}
+  \headdecl{sys/types.h}
+  \headdecl{unistd.h}
+  
+  \funcdecl{int getgroups(int size, gid\_t list[])} Legge gli identificatori
+  dei gruppi supplementari del processo sul vettore \param{list} di dimensione
+  \param{size}.
+  
+  \bodydesc{La funzione restituisce il numero di gruppi letti in caso di
+    successo e -1 in caso di fallimento, nel qual caso \var{errno} viene
+    settata a: 
+    \begin{errlist}
+    \item[\macro{EFAULT}] \param{list} non ha un indirizzo valido.
+    \item[\macro{EINVAL}] il valore di \param{size} è diverso da zero ma
+      minore del numero di gruppi supplementari del processo.
+    \end{errlist}}
+\end{functions}
+\noindent non è specificato se la funzione inserisca o meno nella lista
+l'\textit{effective user id} del processo. Se si specifica un valore di
+\param{size} uguale a 0 \param{list} non viene modificato, ma si ottiene il
+numero di gruppi supplementari.
+
+Una seconda funzione, \func{getgrouplist}, può invece essere usata per
+ottenere tutti i gruppi a cui appartiene un utente; il suo prototipo è:
+\begin{functions}
+  \headdecl{sys/types.h} 
+  \headdecl{grp.h}
+  
+  \funcdecl{int getgrouplist(const char *user, gid\_t group, gid\_t *groups,
+    int *ngroups)} Legge i gruppi supplementari dell'utente \param{user}.
+  
+  \bodydesc{La funzione legge fino ad un massimo di \param{ngroups} valori,
+    restituisce 0 in caso di successo e -1 in caso di fallimento.}
+\end{functions}
+\noindent la funzione esegue una scansione del database dei gruppi (si veda
+\secref{sec:sys_xxx}) e ritorna in \param{groups} la lista di quelli a cui
+l'utente appartiene. Si noti che \param{ngroups} è passato come puntatore
+perché qualora il valore specificato sia troppo piccolo la funzione ritorna -1
+e passando indietro il numero dei gruppi trovati.
+
+Per settare i gruppi supplementari di un processo ci sono due funzioni, che
+possono essere usate solo se si hanno i privilegi di amministratore. La prima
+delle due è \func{setgroups}, ed il suo prototipo è:
+\begin{functions}
+  \headdecl{sys/types.h}
+  \headdecl{grp.h}
+  
+  \funcdecl{int setgroups(size\_t size, gid\_t *list)} Setta i gruppi
+  supplementari del processo ai valori specificati in \param{list}.
+
+  \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
+    fallimento, nel qual caso \var{errno} viene settata a:
+    \begin{errlist}
+    \item[\macro{EFAULT}] \param{list} non ha un indirizzo valido.
+    \item[\macro{EPERM}] il processo non ha i privilegi di amministratore.
+    \item[\macro{EINVAL}] il valore di \param{size} è maggiore del valore
+    massimo (\macro{NGROUPS}, che per Linux è 32).
+    \end{errlist}}
+\end{functions}
+
+Se invece si vogliono settare i gruppi supplementari del processo a quelli di
+un utente specifico si può usare \func{initgroups} il cui prototipo è:
+\begin{functions}
+  \headdecl{sys/types.h}
+  \headdecl{grp.h}
+
+  \funcdecl{int initgroups(const char *user, gid\_t group)} Setta i gruppi
+  supplementari del processo a quelli di cui è membro l'utente \param{user},
+  aggiungendo il gruppo addizionale \param{group}.
+  
+  \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
+    fallimento, nel qual caso \var{errno} viene settata agli stessi valori di
+    \func{setgroups} più \macro{ENOMEM} quando non c'è memoria sufficiente per
+    allocare lo spazio per informazioni dei gruppi.}
+\end{functions}
+
+La funzione esegue la scansione del database dei gruppi (usualmente
+\file{/etc/groups}) cercando i gruppi di cui è membro \param{user} costruendo
+una lista di gruppi supplementari a cui aggiunge \param{group}, che poi setta
+usando \func{setgroups}.
+
+Si tenga presente che sia \func{setgroups} che \func{initgroups} non sono
+definite nello standard POSIX.1 e che pertanto non è possibile utilizzarle
+quando si definisce \macro{\_POSIX\_SOURCE} o si compila con il flag
+\cmd{-ansi}.
+
+
+\section{La gestione della priorità di esecuzione}
+\label{sec:proc_priority}
+
+In questa sezione tratteremo più approfonditamente i meccanismi con il quale
+lo \textit{scheduler} assegna la CPU ai vari processi attivi, illustrando le
+varie funzioni che permettono di leggere e modificare le priorità di
+esecuzione dei programmi.
+
+
+
+
+
 \section{Problematiche di programmazione multitasking}
 \label{sec:proc_multi_prog}
 
 Benché i processi siano strutturati in modo da apparire il più possibile come
 \section{Problematiche di programmazione multitasking}
 \label{sec:proc_multi_prog}
 
 Benché i processi siano strutturati in modo da apparire il più possibile come
-indipendenti l'uno dall'altro, nella programmazione in un sistema multiutente
-occorre tenere conto di tutta una serie di problematiche che normalmente non
+indipendenti l'uno dall'altro, nella programmazione in un sistema multitasking
+occorre tenere conto di una serie di problematiche che normalmente non
 esistono quando si ha a che fare con un sistema in cui viene eseguito un solo
 esistono quando si ha a che fare con un sistema in cui viene eseguito un solo
-programma alla volta. 
+programma alla volta.
 
 
-Pur non essendo tutto questo direttamente legato alla modalità specifica in
-cui il multitasking è implementato in un sistema unix-like, né al solo
-concetto di multitasking (le stesse problematiche si presentano ad esempio
-nella gestione degli interrupt hardware), in questa sezione conclusiva del
-capitolo in cui abbiamo affrontato la gestione dei processi, introdurremo
-sinteticamente queste problematiche, che ritroveremo a più riprese in capitoli
-successivi, con una breve definizione della terminologia e delle loro
-caratteristiche di fondo.
+Pur essendo questo argomento di carattere generale, in questa sezione
+conclusiva del capitolo in cui abbiamo affrontato la gestione dei processi ci
+è parso opportuno introdurre sinteticamente queste problematiche, che
+ritroveremo a più riprese in capitoli successivi, dando una breve descrizione
+delle loro caratteristiche principali e della terminologia relativa.
 
 
 \subsection{Le operazioni atomiche}
 
 
 \subsection{Le operazioni atomiche}
@@ -1819,4 +1955,7 @@ varie funzioni di libreria, che sono identificate aggiungendo il suffisso
 
 
 
 
 
 
-
+%%% Local Variables: 
+%%% mode: latex
+%%% TeX-master: "gapil"
+%%% End: