\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
\hline
\hline
$<-1$& -- & attende per un figlio il cui \textit{process group} (vedi
- \ref{sec:sess_proc_group}) è uguale al
+ \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 \secref{sec:sess_job_control}) 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}
supplementari} (vedi \secref{sec:proc_access_id}).
\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_xxx}).
+\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}