\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}
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
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}
\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 è
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}
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}
\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}] Imposta i bit di controllo per l'emulazione
+ della virgola mobile su architettura ia64, secondo il valore
+ di \param{arg2}, si deve passare \const{PR\_FPEMU\_NOPRINT} per emulare in
+ maniera trasparente l'accesso alle operazioni in virgola mobile, o
+ \const{PR\_FPEMU\_SIGFPE} per non emularle ed inviare il segnale
+ \const{SIGFPE}. Introdotta a partire dal kernel 2.4.18, solo su ia64.
+\item[\const{PR\_GET\_FPEMU}] Ottiene il valore dei flag di controllo
+ dell'emulazione della virgola mobile, salvato all'indirizzo puntato
+ da \param{arg2}, che deve essere di tipo \code{(int *)}. Introdotta a
+ partire dal kernel 2.4.18, solo su ia64.
+\item[\const{PR\_SET\_FPEXC}] Imposta la modalità delle eccezioni in virgola
+ mobile (\textit{floating-point exception mode}) al valore di \param{arg2}.
+ I valori possibili sono: \const{PR\_FP\_EXC\_SW\_ENABLE} per usare FPEXC per
+ le eccezioni, \const{PR\_FP\_EXC\_DIV} per la divisione per zero in virgola
+ mobile, \const{PR\_FP\_EXC\_OVF} per gli overflow, \const{PR\_FP\_EXC\_UND}
+ per gli underflow, \const{PR\_FP\_EXC\_RES} per risultati non esatti,
+ \const{PR\_FP\_EXC\_INV} per operazioni invalide,
+ \const{PR\_FP\_EXC\_DISABLED} per disabilitare le eccezioni,
+ \const{PR\_FP\_EXC\_NONRECOV} per utilizzare la modalità di eccesione
+ asincrona non recuperabile, \const{PR\_FP\_EXC\_ASYNC} per utilizzare la
+ modalità di eccesione asincrona recuperabile, \const{PR\_FP\_EXC\_PRECISE}
+ per la modalita precisa di eccezione.\footnote{trattasi di gestione
+ specialistica della gestione delle eccezioni dei calcoli in virgola mobile
+ che, i cui dettagli al momento vanno al di là dello scopo di questo
+ testo.} Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
+\item[\const{PR\_GET\_FPEXC}] Ottiene il valore della modalità delle eccezioni
+ delle operazioni in virgola mobile, salvata all'indirizzo
+ puntato \param{arg2}, che deve essere di tipo \code{(int *)}. Introdotta a
+ partire dal kernel 2.4.21, solo su PowerPC.
+\item[\const{PR\_SET\_KEEPCAPS}] Consente di controllare quali
+ \textit{capabilities} vengono cancellate quando si esegue un cambiamento di
+ \textit{user-ID} del processo (per i dettagli si veda
+ sez.~\ref{sec:proc_capabilities}, in particolare quanto illustrato a
+ pag.~\pageref{sec:capability-uid-transition}). Un valore nullo (il default)
+ per \param{arg2} comporta che vengano cancellate, il valore 1 che vengano
+ manenute, questo valore viene sempre cancellato attraverso una
+ \func{exec}. L'uso di questo flag è stato sostituito, a partire dal kernel
+ 2.6.26, dal flag \const{SECURE\_KEEP\_CAPS} dei \itindex{securebits}
+ \textit{securebits} (vedi \const{PR\_SET\_SECUREBITS}). Introdotta a partire
+ dal kernel 2.2.18.
+\item[\const{PR\_GET\_KEEPCAPS}] Ottiene come valore di ritorno della funzione
+ il valore del flag di controllo impostato con
+ \const{PR\_SET\_KEEPCAPS}. Introdotta a partire dal kernel 2.2.18.
+\item[\const{PR\_SET\_NAME}] Imposta il nome del processo chiamante alla
+ stringa puntata da \param{arg2}, che deve essere di tipo \code{(char *)}. Il
+ nome può essere lungo al massimo 16 caratteri, e la stringa deve essere
+ terminata da NUL se più corta. Introdotta a partire dal kernel 2.6.9.
+\item[\const{PR\_GET\_NAME}] Ottiene il nome del processo chiamante nella
+ stringa puntata da \param{arg2}, che deve essere di tipo \code{(char *)}; si
+ devono allocare per questo almeno 16 byte, e il nome sarà terminato da NUL
+ se più corto. Introdotta a partire dal kernel 2.6.9.
+\item[\const{PR\_SET\_PDEATHSIG}] Consente di richiedere l'emissione di un
+ segnale, che sarà ricevuto dal processo chiamante, in occorrenza della
+ terminazione del proprio processo padre.\footnote{in sostanza consente di
+ invertire il ruolo di \const{SIGCHLD}.} Il valore di \param{arg2} deve
+ indicare il numero del segnale, o 0 per disabilitare l'emissione. Il valore
+ viene automaticamente cancellato per un processo figlio creato con
+ \func{fork}. Introdotta a partire dal kernel 2.1.57.
+\item[\const{PR\_GET\_PDEATHSIG}] Ottiene il valore dell'eventuale segnale
+ emesso alla terminazione del padre, salvato all'indirizzo
+ puntato \param{arg2}, che deve essere di tipo \code{(int *)}. Introdotta a
+ partire dal kernel 2.3.15.
+\item[\const{PR\_SET\_SECCOMP}] Imposta il cosiddetto
+ \itindex{secure~computing~mode} \textit{secure computing mode} per il
+ processo corrente. Prevede come unica possibilità che \param{arg2} sia
+ impostato ad 1. Una volta abilitato il \textit{secure computing mode} il
+ processo potrà utilizzare soltanto un insieme estremamente limitato di
+ \textit{system call}: \func{read}, \func{write}, \func{\_exit} e
+ \func{sigreturn}, ogni altra \textit{system call} porterà all'emissione di
+ un \func{SIGKILL}. Il \textit{secure computing mode} è stato ideato per
+ fornire un supporto per l'esecuzione di codice esterno non fidato e non
+ verificabile a scopo di calcolo;\footnote{lo scopo è quello di poter vendere
+ la capacità di calcolo della proprio macchina ad un qualche servizio di
+ calcolo distribuito senza comprometterne la sicurezza eseguendo codice non
+ sotto il proprio controllo.} in genere i dati vengono letti o scritti
+ grazie ad un socket o una pipe, e per evitare problemi di sicurezza non sono
+ possibili altre operazioni se non quelle citate. Introdotta a partire dal
+ kernel 2.6.23, disponibile solo se si è abilitato il supporto nel kernel con
+ \texttt{CONFIG\_SECCOMP}.
+\item[\const{PR\_GET\_SECCOMP}] Ottiene come valore di ritorno della funzione
+ lo stato corrente del \textit{secure computing mode}, al momento attuale la
+ funzione è totalmente inutile in quanto l'unico valore ottenibile è 0, dato
+ che la chiamata di questa funzione in \textit{secure computing mode}
+ comporterebbe l'emissione di \texttt{SIGKILL}, è stata comunque definita per
+ eventuali estensioni future. Introdotta a partire dal kernel 2.6.23.
+\item[\const{PR\_SET\_SECUREBITS}] Imposta i \itindex{securebits}
+ \textit{securebits} per il processo corrente al valore indicato
+ da \param{arg2}; per i dettagli si veda sez.~\ref{sec:proc_capabilities}, ed
+ in particolare i valori di tab.~\ref{tab:securebits_values} e la relativa
+ trattazione. Introdotta a partire dal kernel 2.6.26.
+\item[\const{PR\_GET\_SECUREBITS}] Ottiene come valore di ritorno della
+ funzione l'impostazione corrente per i \itindex{securebits}
+ \textit{securebits}. Introdotta a partire dal kernel 2.6.26.
+\item[\const{PR\_SET\_TIMING}] Imposta il metodo di temporizzazione del
+ processo da indicare con il valore di \param{arg2}, con
+ \const{PR\_TIMING\_STATISTICAL} si usa il metodo statistico tradizionale,
+ con \const{PR\_TIMING\_TIMESTAMP} il più accurato basato su dei
+ \textit{timestamp}, quest'ultimo però non è ancora implementato ed il suo
+ uso comporta la restituzione di un errore di \errval{EINVAL}. Introdotta a
+ partire dal kernel 2.6.0-test4.
+\item[\const{PR\_GET\_TIMING}] Ottiene come valore di ritorno della funzione
+ il metodo di temporizzazione del processo attualmente in uso. Introdotta a
+ partire dal kernel 2.6.0-test4.
+\item[\const{PR\_SET\_TSC}] Imposta il flag che indica se il processo può
+ leggere il registro di processore contenente il contatore dei
+ \textit{timestamp} (TSC, o \textit{Time Stamp Counter}) da indicare con il
+ valore di \param{arg2}. Si deve specificare \const{PR\_TSC\_ENABLE} per
+ abilitare la lettura o \const{PR\_TSC\_SIGSEGV} per disabilitarla con la
+ generazione di un segnale di \const{SIGSEGV}. La lettura viene
+ automaticamente disabilitata se si attiva il \textit{secure computing mode}.
+ Introdotta a partire dal kernel 2.6.26, solo su x86.
+\item[\const{PR\_GET\_TSC}] Ottiene il valore del flag che controlla la
+ lettura del contatatore dei \textit{timestamp}, salvato all'indirizzo
+ puntato \param{arg2}, che deve essere di tipo \code{(int *)}. Introdotta a
+ partire dal kernel 2.6.26, solo su x86.
+% articoli sul TSC e relativi problemi: http://lwn.net/Articles/209101/,
+% http://blog.cr0.org/2009/05/time-stamp-counter-disabling-oddities.html,
+% http://en.wikipedia.org/wiki/Time_Stamp_Counter
+\item[\const{PR\_SET\_UNALIGN}] Imposta la modalità di controllo per l'accesso
+ a indirizzi di memoria non allineati, che in varie architetture risultano
+ illegali, da indicare con il valore di \param{arg2}. Si deve specificare
+ \const{PR\_UNALIGN\_NOPRINT} per ignorare gli accessi non allineati, e
+ \const{PR\_UNALIGN\_SIGBUS} per generare un segnale di \const{SIGBUS} in
+ caso di accesso non allineato. Introdotta con diverse versioni su diverse
+ architetture.
+\item[\const{PR\_GET\_UNALIGN}] Ottiene il valore della modalità di controllo
+ per l'accesso a indirizzi di memoria non allineati, salvato all'indirizzo
+ puntato \param{arg2}, che deve essere di tipo \code{(int *)}. Introdotta con
+ diverse versioni su diverse architetture.
+\item[\const{PR\_MCE\_KILL}] Introdotta a partire dal kernel 2.6.32.
+\item[\const{PR\_MCE\_KILL\_GET}] Introdotta a partire dal kernel 2.6.32.
+\label{sec:prctl_operation}
+\end{basedescript}
+
+
+
\subsection{La funzione \func{ptrace}}
\label{sec:process_ptrace}
Da fare
+% TODO: funzioni varie sparse citate da qualche parte e da trattare forse in
+% una sezione a parte: sigreturn,
+
+
\section{Problematiche di programmazione multitasking}
\label{sec:proc_multi_prog}