sessione.
Oltre al \acr{pid} e al \acr{ppid}, (e a quelli che vedremo in
-\secref{sec:sess_xxx}, relativi al controllo di sessione), ad ogni processo
-vengono associati degli altri identificatori che vengono usati per il
+\secref{sec:sess_proc_group}, relativi al controllo di sessione), ad ogni
+processo vengono associati degli altri identificatori che vengono usati per il
controllo di accesso. Questi servono per determinare se un processo può
eseguire o meno le operazioni richieste, a seconda dei privilegi e
dell'identità di chi lo ha posto in esecuzione; l'argomento è complesso e sarà
\secref{sec:proc_access_id}).
\item gli identificatori per il controllo di sessione: il \textit{process
groupid} e il \textit{session id} ed il terminale di controllo (vedi
- \secref{sec:sess_xxx} e \secref{sec:sess_xxx}).
+ \secref{sec:sess_proc_group}).
\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 se la conclusione di un processo rende orfano un \textit{process
group} ciascun membro del gruppo viene bloccato, e poi gli vengono
inviati in successione i segnali \macro{SIGHUP} e \macro{SIGCONT}
- (vedi \secref{sec:sess_xxx}).
+ (vedi \secref{sec:sess_ctrl_term}).
\end{itemize*}
Oltre queste operazioni è però necessario poter disporre di un meccanismo
Questo viene fatto mantenendo attiva la voce nella tabella dei processi, e
memorizzando alcuni dati essenziali, come il \acr{pid}, i tempi di CPU usati
-dal processo (vedi \secref{sec:sys_unix_time}) e lo stato di
-terminazione\footnote{NdA verificare esattamente cosa c'è!}, mentre la memoria
-in uso ed i file aperti vengono rilasciati immediatamente. I processi che sono
-terminati, ma il cui stato di terminazione non è stato ancora ricevuto dal
-padre sono chiamati \textit{zombie}, essi restano presenti nella tabella dei
-processi ed in genere possono essere identificati dall'output di \cmd{ps} per
-la presenza di una \texttt{Z} nella colonna che ne indica lo stato. Quando il
-padre effettuerà la lettura dello stato di uscita anche questa informazione,
-non più necessaria, verrà scartata e la terminazione potrà dirsi completamente
+dal processo (vedi \secref{sec:sys_unix_time}) e lo stato di terminazione,
+mentre la memoria in uso ed i file aperti vengono rilasciati immediatamente. I
+processi che sono terminati, ma il cui stato di terminazione non è stato
+ancora ricevuto dal padre sono chiamati \textit{zombie}, essi restano presenti
+nella tabella dei processi ed in genere possono essere identificati
+dall'output di \cmd{ps} per la presenza di una \texttt{Z} nella colonna che ne
+indica lo stato (vedi \tabref{tab:proc_proc_states}). Quando il padre
+effettuerà la lettura dello stato di uscita anche questa informazione, non più
+necessaria, verrà scartata e la terminazione potrà dirsi completamente
conclusa.
Possiamo utilizzare il nostro programma di prova per analizzare anche questa
Per questo motivo lo standard POSIX.1 ha introdotto la funzione \func{waitpid}
che effettua lo stesso servizio, ma dispone di una serie di funzionalità più
-ampie, legate anche al controllo di sessione. Dato che è possibile ottenere
-lo stesso comportamento di \func{wait} si consiglia di utilizzare sempre
-questa funzione, il cui prototipo è:
+ampie, legate anche al controllo di sessione (si veda
+\ref{sec:sess_job_control}). Dato che è possibile ottenere lo stesso
+comportamento di \func{wait} si consiglia di utilizzare sempre questa
+funzione, il cui prototipo è:
\begin{functions}
\headdecl{sys/types.h}
\headdecl{sys/wait.h}
possibilità si specificare un'opzione \macro{WNOHANG} che ne previene il
blocco; inoltre \func{waitpid} può specificare quale processo attendere sulla
base del valore fornito dall'argomento \param{pid}, secondo lo
-specchietto riportato in \ntab:
+specchietto riportato in \tabref{tab:proc_waidpid_pid}:
\begin{table}[!htb]
\centering
\footnotesize
\textbf{Valore} & \textbf{Macro} &\textbf{Significato}\\
\hline
\hline
- $<-1$& -- & attende per un figlio il cui \textit{process group} è uguale al
+ $<-1$& -- & attende per un figlio il cui \textit{process group} (vedi
+ \secref{sec:sess_proc_group}) è uguale al
valore assoluto di \var{pid}. \\
$-1$ & \macro{WAIT\_ANY} & attende per un figlio qualsiasi, usata in
questa maniera è equivalente a \func{wait}.\\
Il comportamento di \func{waitpid} può inoltre essere modificato passando
delle opportune opzioni tramite l'argomento \param{option}. I valori possibili
sono il già citato \macro{WNOHANG}, che previene il blocco della funzione
-quando il processo figlio non è terminato, e \macro{WUNTRACED} (usata per il
-controllo di sessione, trattato in \capref{cha:session}) che fa ritornare la
-funzione anche per i processi figli che sono bloccati ed il cui stato non è
-stato ancora riportato al padre. Il valore dell'opzione deve essere
-specificato come maschera binaria ottenuta con l'OR delle suddette costanti
-con zero.
+quando il processo figlio non è terminato, e \macro{WUNTRACED}. Quest'ultimo
+viene generalmente usato per il controllo di sessione, (trattato in
+\secref{sec:sess_job_control}) in quanto permette di identificare i processi
+bloccati. La funzione infatti in tal caso ritorna, restituendone il \acr{pid},
+se c'è un processo figlio che è entrato in stato di sleep (vedi
+\tabref{tab:proc_proc_states}) di cui non si è ancora letto lo stato (con
+questa stessa opzione). Il valore dell'opzione deve essere specificato come
+maschera binaria ottenuta con l'OR delle suddette costanti con zero. In Linux
+sono previste altre opzioni non standard relative al comportamento con i
+thread, che saranno trattate in \secref{sec:thread_xxx}.
La terminazione di un processo figlio è chiaramente un evento asincrono
rispetto all'esecuzione di un programma e può avvenire in un qualunque
argomento. I parametri successivi consentono di specificare gli argomenti a
linea di comando e l'ambiente ricevuti dal nuovo processo.
-\bodydesc{Queste funzioni ritornano solo in caso di errore, restituendo
- -1; nel qual caso \var{errno} andrà ad assumere i valori visti in
- precedenza per \func{execve}.}
+\bodydesc{Queste funzioni ritornano solo in caso di errore, restituendo -1;
+ nel qual caso \var{errno} assumerà i valori visti in precedenza per
+ \func{execve}.}
\end{functions}
Per capire meglio le differenze fra le funzioni della famiglia si può fare
\begin{figure}[htb]
\centering
- \includegraphics[width=13cm]{img/exec_rel}
+ \includegraphics[width=15cm]{img/exec_rel}
\caption{La interrelazione fra le sei funzioni della famiglia \func{exec}.}
\label{fig:proc_exec_relat}
\end{figure}
(\acr{ppid}).
\item l'\textsl{userid reale}, il \textit{groupid reale} ed i \textsl{groupid
supplementari} (vedi \secref{sec:proc_access_id}).
-\item il \textit{session id} ed il \textit{process groupid} (vedi
- \secref{sec:sess_xxx}).
-\item il terminale di controllo (vedi \secref{sec:sess_xxx}).
+\item il \textit{session id} (\acr{sid}) ed il \textit{process groupid}
+ (\acr{pgid}), vedi \secref{sec:sess_proc_group}.
+\item il terminale di controllo (vedi \secref{sec:sess_ctrl_term}).
\item il tempo restante ad un allarme (vedi \secref{sec:sig_alarm_abort}).
\item la directory radice e la directory di lavoro corrente (vedi
\secref{sec:file_work_dir}).
Come accennato in \secref{sec:intro_multiuser} il modello base\footnote{in
realtà già esistono estensioni di questo modello base, che lo rendono più
flessibile e controllabile, come le \textit{capabilities}, le ACL per i file
- o il \textit{Mandatory Access Control} di SELinux.} di sicurezza di un
-sistema unix-like è fondato sui concetti di utente e gruppo, e sulla
+ o il \textit{Mandatory Access Control} di SELinux; inoltre basandosi sul
+ lavoro effettuato con SELinux, a partire dal kernel 2.5.x, è iniziato lo
+ sviluppo di una infrastruttura di sicurezza, il \textit{Linux Security
+ Modules}, ol LSM, in grado di fornire diversi agganci a livello del kernel
+ per modularizzare tutti i possibili controlli di accesso.} di sicurezza di
+un sistema unix-like è fondato sui concetti di utente e gruppo, e sulla
separazione fra l'amministratore (\textsl{root}, detto spesso anche
\textit{superuser}) che non è sottoposto a restrizioni, ed il resto degli
utenti, per i quali invece vengono effettuati i vari controlli di accesso.
\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
- impostata a:
+ successo e -1 in caso di fallimento, nel qual caso \var{errno} assumerà
+ i valori:
\begin{errlist}
\item[\macro{EFAULT}] \param{list} non ha un indirizzo valido.
\item[\macro{EINVAL}] il valore di \param{size} è diverso da zero ma
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 impostata a:
+ fallimento, nel qual caso \var{errno} assumerà i valori:
\begin{errlist}
\item[\macro{EFAULT}] \param{list} non ha un indirizzo valido.
\item[\macro{EPERM}] il processo non ha i privilegi di amministratore.
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 impostata agli stessi valori di
+ fallimento, nel qual caso \var{errno} assumerà gli stessi valori di
\func{setgroups} più \macro{ENOMEM} quando non c'è memoria sufficiente per
allocare lo spazio per informazioni dei gruppi.}
\end{functions}