Quasi finito con le capabilities, aggiunti pezzi su prctl, spostata la
[gapil.git] / prochand.tex
index be5e9767554d85d7b5ef362e49dcaf4d0fdd3dc5..8d7487b54fd97af4d4c5cda770cc2f1129708b0c 100644 (file)
@@ -138,7 +138,7 @@ fig.~\ref{fig:proc_task_struct}.
 
 \begin{figure}[htb]
   \centering
-  \includegraphics[width=12cm]{img/task_struct}
+  \includegraphics[width=14cm]{img/task_struct}
   \caption{Schema semplificato dell'architettura delle strutture usate dal
     kernel nella gestione dei processi.}
   \label{fig:proc_task_struct}
@@ -868,8 +868,7 @@ terminare il processo che li ha generati, in modo che \cmd{init} possa
 adottarli e provvedere a concluderne la terminazione.
 
 
-\subsection{La funzione \func{waitpid} e le funzioni di ricezione degli stati
-  di uscita}
+\subsection{Le funzioni di attesa e ricezione degli stati di uscita}
 \label{sec:proc_wait}
 
 Uno degli usi più comuni delle capacità multitasking di un sistema unix-like
@@ -878,8 +877,8 @@ principale attende le richieste che vengono poi soddisfatte da una serie di
 processi figli. Si è già sottolineato al paragrafo precedente come in questo
 caso diventi necessario gestire esplicitamente la conclusione dei figli onde
 evitare di riempire di \index{zombie} \textit{zombie} la tabella dei processi;
-le funzioni deputate a questo compito sono principalmente due, \funcd{wait} e
-\func{waitpid}. La prima, il cui prototipo è:
+le funzioni deputate a questo compito sono principalmente due, la prima è
+\funcd{wait} ed il suo prototipo è:
 \begin{functions}
 \headdecl{sys/types.h}
 \headdecl{sys/wait.h}
@@ -895,16 +894,20 @@ segnale termina il processo o chiama una funzione di gestione.
   \end{errlist}}
 \end{functions}
 \noindent
-è presente fin dalle prime versioni di Unix; la funzione ritorna non appena un
-processo figlio termina. Se un figlio è già terminato la funzione ritorna
-immediatamente, se più di un figlio è terminato occorre chiamare la funzione
-più volte se si vuole recuperare lo stato di terminazione di tutti quanti.
+
+Questa funzione è presente fin dalle prime versioni di Unix; essa ritorna non
+appena un qualunque processo figlio termina. Se un figlio è già terminato
+prima della chiamata la funzione ritorna immediatamente, se più di un figlio è
+già terminato occorre continuare chiamare la funzione più volte se si vuole
+recuperare lo stato di terminazione di tutti quanti.
 
 Al ritorno della funzione lo stato di terminazione del figlio viene salvato
 nella variabile puntata da \param{status} e tutte le risorse del kernel
-relative al processo (vedi sez.~\ref{sec:proc_termination}) vengono rilasciate.
-Nel caso un processo abbia più figli il valore di ritorno (il \acr{pid} del
-figlio) permette di identificare qual è quello che è uscito.
+relative al processo (vedi sez.~\ref{sec:proc_termination}) vengono
+rilasciate.  Nel caso un processo abbia più figli il valore di ritorno della
+funzione sarà impostato al \acr{pid} del processo di cui si è ricevuto lo
+stato di terminazione, cosa che permette di identificare qual è il figlio che
+è terminato.
 
 Questa funzione ha il difetto di essere poco flessibile, in quanto ritorna
 all'uscita di un qualunque processo figlio. Nelle occasioni in cui è
@@ -913,14 +916,14 @@ predisporre un meccanismo che tenga conto dei processi già terminati, e
 provvedere a ripetere la chiamata alla funzione nel caso il processo cercato
 sia ancora attivo.
 
-Per questo motivo lo standard POSIX.1 ha introdotto la funzione
-\funcd{waitpid} che effettua lo stesso servizio, ma dispone di una serie di
-funzionalità più ampie, legate anche al controllo di sessione (si veda
+Per questo motivo lo standard POSIX.1 ha introdotto una seconda funzione che
+effettua lo stesso servizio, ma dispone di una serie di funzionalità più
+ampie, legate anche al controllo di sessione (si veda
 sez.~\ref{sec:sess_job_control}).  Dato che è possibile ottenere lo stesso
 comportamento di \func{wait}\footnote{in effetti il codice
   \code{wait(\&status)} è del tutto equivalente a \code{waitpid(WAIT\_ANY,
-    \&status, 0)}.} si consiglia di utilizzare sempre questa funzione, il cui
-prototipo è:
+    \&status, 0)}.} si consiglia di utilizzare sempre questa nuova funzione,
+\funcd{waitpid}, il cui prototipo è:
 \begin{functions}
 \headdecl{sys/types.h}
 \headdecl{sys/wait.h}
@@ -3283,9 +3286,12 @@ rimosso a partire dal kernel 2.6.25.
 
 Nelle precedenti sezioni si sono trattate la gran parte delle funzioni che
 attengono alla gestione ordinaria dei processi e delle loro proprietà più
-comuni. Tratteremo qui alcune \textit{system call} specialistiche dedicate
-alla gestione di alcune funzionalità specifiche ed avanzate il cui uso è in
-genere piuttosto ridotto.
+comuni. Tratteremo qui alcune \textit{system call} dedicate alla gestione di
+funzionalità dei processi molto specifiche ed avanzate, il cui uso è in genere
+piuttosto ridotto. Trattandosi di problematiche relativamente complesse, che
+spesso presuppongono la conoscenza di altri argomenti trattati più avanti
+nella guida, si può saltare questa lezione ad una prima lettura, tornando su
+di essa in un secondo tempo.
 
 \subsection{La system call \func{clone}}
 \label{sec:process_clone}
@@ -3295,7 +3301,122 @@ Da fare
 \subsection{La funzione \func{prctl}}
 \label{sec:process_prctl}
 
-Da fare
+Benché la gestione ordinaria possa essere effettuata attraverso le funzioni
+che abbiamo già esaminato nelle sezioni precedenti, esistono una serie di
+proprietà e caratteristiche particolari dei processi non coperte da esse, per
+la cui gestione è stata predisposta una apposita \textit{system call} che
+fornisce una interfaccia generica per tutte le operazioni specialistiche. La
+funzione è \funcd{prctl} ed il suo prototipo è:\footnote{la funzione non è
+  standardizzata ed è specifica di Linux, anche se ne esiete una analoga in
+  IRIX, è stata introdotta con il kernel 2.1.57.}
+\begin{functions}
+  \headdecl{sys/prctl.h}
+
+  \funcdecl{int prctl(int option, unsigned long arg2, unsigned long arg3,
+    unsigned long arg4, unsigned long arg5)}
+  
+  Esegue una operazione speciale sul processo corrente.
+  
+  \bodydesc{La funzione ritorna 0 o un valore positivo dipendente
+    dall'operazione in caso di successo e $-1$ in caso di errore, nel qual
+    caso \var{errno} assumerà valori diversi a seconda del tipo di operazione
+    richiesta (in genere \errval{EINVAL} o \errval{EPERM}).  }
+\end{functions}
+
+La funzione ritorna un valore nullo o positivo in caso di successo e $-1$ in
+caso di errore; il significato degli argomenti della funzione successivi al
+primo, il valore di ritorno in caso di successo, il tipo di errore restituito
+in \var{errno} dipendono dall'operazione eseguita, indicata tramite il primo
+argomento, \param{option}. Questo è un valore intero che identifica
+l'operazione, e deve essere specificato con l'uso di una delle costanti
+predefinite del seguente elenco, che illustra quelle disponibili al momento:
+
+\begin{basedescript}{\desclabelstyle{\pushlabel}}
+\item[\const{PR\_CAPBSET\_READ}] Controlla la disponibilità di una delle
+  \textit{capabilities} (vedi sez.~\ref{sec:proc_capabilities}). La funzione
+  ritorna 1 se la capacità specificata nell'argomento \param{arg2} (con una
+  delle costanti di tab.~\ref{tab:proc_capabilities}) è presente nel
+  \textit{capabilities bounding set} del processo e zero altrimenti,
+  se \param{arg2} non è un valore valido si avrà un errore di \errval{EINVAL}.
+  Introdotta a partire dal kernel 2.6.25.
+\item[\const{PR\_CAPBSET\_DROP}] Rimuove permanentemente una delle
+  \textit{capabilities} (vedi sez.~\ref{sec:proc_capabilities}) dal processo e
+  da tutti i suoi discendenti. La funzione cancella la capacità specificata
+  nell'argomento \param{arg2} con una delle costanti di
+  tab.~\ref{tab:proc_capabilities} dal \textit{capabilities bounding set} del
+  processo. L'operazione richiede i privilegi di amministratore (la capacità
+  \const{CAP\_SETPCAP}), altrimenti fallisce con un errore di \errval{EPERM};
+  se il valore di \param{arg2} non è valido o se il supporto per le
+  \textit{file capabilities} non è stato compilato nel kernel fallisce con un
+  errore di \errval{EINVAL}. Introdotta a partire dal kernel 2.6.25.
+\item[\const{PR\_SET\_DUMPABLE}] Imposta il flag che determina se la
+  terminazione di un processo a causa di un segnale per il quale è prevista la
+  generazione di un file di \itindex{core~dump} \textit{core dump} (vedi
+  sez.~\ref{sec:sig_standard}) lo genera effettivamente. In genere questo flag
+  viene attivato automaticamente, ma per evitare problemi di sicurezza (la
+  generazione di un file da parte di processi privilegiati può essere usata
+  per sovrascriverne altri) viene cancellato quando si mette in esecuzione un
+  programma con i bit \acr{suid} e \acr{sgid} attivi (vedi
+  sez.~\ref{sec:file_special_perm}) o con l'uso delle funzioni per la modifica
+  degli \textit{user-ID} dei processi (vedi
+  sez.~\ref{sec:proc_setuid}). L'operazione è stata introdotta a partire dal
+  kernel 2.3.20, fino al kernel 2.6.12 e per i kernel successivi al 2.6.17 era
+  possibile usare solo un valore 0 di \param{arg2} per disattivare il flag ed
+  un valore 1 per attivarlo, nei kernel dal 2.6.13 al 2.6.17 è stato
+  supportato anche il valore 2 che causava la generazione di un
+  \itindex{core~dump} \textit{core dump} leggibile solo
+  dall'amministratore.\footnote{la funzionalità è stata rimossa per motivi di
+    sicurezza, in quanto consentiva ad un utente normale di creare un file di
+    \textit{core dump} appartenente all'amministratore in directory dove
+    l'utente avrebbe avuto permessi di accesso.}
+\item[\const{PR\_GET\_DUMPABLE}] Ottiene come valore di ritorno della funzione
+  lo stato corrente del flag che controlla la effettiva generazione dei
+  \itindex{core~dump} \textit{core dump}. Introdotta a partire dal kernel
+  2.3.20.
+\item[\const{PR\_SET\_ENDIAN}] Imposta la \textit{endianess} del processo
+  chiamante secondo il valore fornito in \param{arg2}. I valori possibili sono
+  sono: \const{PR\_ENDIAN\_BIG} (\textit{big endian}),
+  \const{PR\_ENDIAN\_LITTLE} (\textit{little endian}), e
+  \const{PR\_ENDIAN\_PPC\_LITTLE} (lo pseudo \textit{little endian} del
+  PowerPC) Introdotta a partire dal kernel 2.6.18, solo per architettura
+  PowerPC.
+\item[\const{PR\_GET\_ENDIAN}] Ottiene il valore della \textit{endianess} del
+  processo chiamante, salvato sulla variabile puntata da \param{arg2} che deve
+  essere passata come di tipo \type{(int *)}. Introdotta a partire dal kernel
+  2.6.18, solo su PowerPC.
+\item[\const{PR\_SET\_FPEMU}] Introdotta a partire dal kernel 2.4.18, solo su
+  ia64.
+\item[\const{PR\_GET\_FPEMU}] Introdotta a partire dal kernel 2.4.18, solo su
+  ia64.
+\item[\const{PR\_SET\_FPEXC}] Introdotta a partire dal kernel 2.4.21, solo su
+  PowerPC.
+\item[\const{PR\_GET\_FPEXC}] Introdotta a partire dal kernel 2.4.21, solo su
+  PowerPC.
+\item[\const{PR\_SET\_KEEPCAPS}] Introdotta  a partire dal kernel 2.2.18.
+\item[\const{PR\_GET\_KEEPCAPS}] Introdotta a partire dal kernel 2.2.18.
+\item[\const{PR\_SET\_NAME}] Introdotta a partire  dal kernel 2.6.9.
+\item[\const{PR\_GET\_NAME}] Introdotta a partire  dal kernel 2.6.9.
+\item[\const{PR\_SET\_PDEATHSIG}] Introdotta  a partire dal kernel 2.1.57.
+\item[\const{PR\_GET\_PDEATHSIG}] Introdotta a partire  dal kernel 2.3.15.
+\item[\const{PR\_SET\_SECCOMP}] Introdotta a partire  dal kernel 2.6.23.
+\item[\const{PR\_GET\_SECCOMP}] Introdotta a partire  dal kernel 2.6.23.
+\item[\const{PR\_SET\_SECUREBITS}] Introdotta a partire  dal kernel 2.6.26.
+\item[\const{PR\_GET\_SECUREBITS}] Introdotta a partire  dal kernel 2.6.26.
+\item[\const{PR\_SET\_TIMING}] Introdotta a partire  dal kernel 2.6.0-test4.
+\item[\const{PR\_GET\_TIMING}] Introdotta a partire dal kernel 2.6.0-test4.
+\item[\const{PR\_SET\_TSC}] Introdotta a partire dal kernel 2.6.26, solo su
+  x86.
+\item[\const{PR\_GET\_TSC}] Introdotta a partire dal kernel 2.6.26, solo su
+  x86.
+\item[\const{PR\_SET\_UNALIGN}] Introdotta con diverse versioni su diverse
+  architetture.
+\item[\const{PR\_GET\_UNALIGN}] Introdotta con diverse versioni su diverse
+  architetture.
+\label{sec:prctl_operation}
+\end{basedescript}
+
+
+
 
 \subsection{La funzione \func{ptrace}}
 \label{sec:process_ptrace}