X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=prochand.tex;h=e3aa1e0152cf5cbf79b658f9f78bd5ecad1c940a;hb=e14c16e9341a6baa99b5e93f733150ba72dfce96;hp=be5e9767554d85d7b5ef362e49dcaf4d0fdd3dc5;hpb=af4cf2bcebfaf023cc182b8370b978194e8027f7;p=gapil.git diff --git a/prochand.tex b/prochand.tex index be5e976..e3aa1e0 100644 --- a/prochand.tex +++ b/prochand.tex @@ -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,225 @@ 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}] 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} @@ -3311,6 +3535,10 @@ Da fare 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}