X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=prochand.tex;h=7e882abcd86f9ebdc60a8a247c572a1ebe8160e0;hp=8d7487b54fd97af4d4c5cda770cc2f1129708b0c;hb=9a577c89dd563aacbc619e09bf8b6d99b533274a;hpb=68fa6cc298c7449a011865c55c5af979963a2753 diff --git a/prochand.tex b/prochand.tex index 8d7487b..7e882ab 100644 --- a/prochand.tex +++ b/prochand.tex @@ -136,9 +136,8 @@ struttura delle principali informazioni contenute nella \struct{task\_struct} (che in seguito incontreremo a più riprese), è mostrato in fig.~\ref{fig:proc_task_struct}. -\begin{figure}[htb] - \centering - \includegraphics[width=14cm]{img/task_struct} +\begin{figure}[!htb] + \centering \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} @@ -310,9 +309,9 @@ affrontato in dettaglio in sez.~\ref{sec:proc_perms}. La funzione \funcd{fork} è la funzione fondamentale della gestione dei processi: come si è detto tradizionalmente l'unico modo di creare un nuovo processo era attraverso l'uso di questa funzione,\footnote{in realtà oggi la - system call usata più comunemente da Linux per creare nuovi processi è - \func{clone} (vedi \ref{sec:process_clone}) , anche perché a partire dalle - \acr{glibc} 2.3.3 non viene più usata la system call originale, ma la stessa + \textit{system call} usata da Linux per creare nuovi processi è \func{clone} + (vedi \ref{sec:process_clone}), anche perché a partire dalle \acr{glibc} + 2.3.3 non viene più usata la \textit{system call} originale, ma la stessa \func{fork} viene implementata tramite \func{clone}, cosa che consente una migliore interazione coi \textit{thread}.} essa quindi riveste un ruolo centrale tutte le volte che si devono scrivere programmi che usano il @@ -372,9 +371,9 @@ sempre un solo padre (il cui \acr{pid} può sempre essere ottenuto con \func{getppid}, vedi sez.~\ref{sec:proc_pid}) per cui si usa il valore nullo, che non è il \acr{pid} di nessun processo. -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/ForkTest.c} \end{minipage} \normalsize @@ -693,8 +692,8 @@ venne introdotta in BSD per migliorare le prestazioni. Dato che Linux supporta il \itindex{copy~on~write} \textit{copy on write} la perdita di prestazioni è assolutamente trascurabile, e l'uso di questa -funzione, che resta un caso speciale della system call \func{clone} (che -tratteremo in dettaglio in sez.~\ref{sec:process_clone}) è deprecato; per +funzione, che resta un caso speciale della \textit{system call} \func{clone} +(che tratteremo in dettaglio in sez.~\ref{sec:process_clone}) è deprecato; per questo eviteremo di trattarla ulteriormente. @@ -983,9 +982,9 @@ deve essere specificato come maschera binaria dei flag riportati nella prima parte in tab.~\ref{tab:proc_waitpid_options} che possono essere combinati fra loro con un OR aritmetico. Nella seconda parte della stessa tabella si sono riportati anche alcuni valori non standard specifici di Linux, che consentono -un controllo più dettagliato per i processi creati con la system call generica -\func{clone} (vedi sez.~\ref{sec:process_clone}) usati principalmente per la -gestione della terminazione dei \itindex{thread} \textit{thread} (vedi +un controllo più dettagliato per i processi creati con la \textit{system call} +generica \func{clone} (vedi sez.~\ref{sec:process_clone}) usati principalmente +per la gestione della terminazione dei \itindex{thread} \textit{thread} (vedi sez.~\ref{sec:thread_xxx}). \begin{table}[!htb] @@ -1002,9 +1001,10 @@ sez.~\ref{sec:thread_xxx}). \const{WCONTINUED}& Ritorna anche quando un processo figlio che era stato fermato ha ripreso l'esecuzione.\footnotemark \\ \hline - \const{\_\_WCLONE}& Attende solo per i figli creati con \func{clone}, - vale a dire processi che non emettono nessun segnale - o emettono un segnale diverso da \const{SIGCHL} alla + \const{\_\_WCLONE}& Attende solo per i figli creati con \func{clone} + (vedi sez.~\ref{sec:process_clone}), vale a dire + processi che non emettono nessun segnale + o emettono un segnale diverso da \const{SIGCHLD} alla terminazione. \\ \const{\_\_WALL} & Attende per qualunque processo figlio. \\ \const{\_\_WNOTHREAD}& Non attende per i figli di altri \textit{thread} @@ -1455,9 +1455,8 @@ Le altre quattro funzioni si limitano invece a cercare di eseguire il file indicato dall'argomento \param{path}, che viene interpretato come il \itindex{pathname} \textit{pathname} del programma. -\begin{figure}[htb] - \centering - \includegraphics[width=12cm]{img/exec_rel} +\begin{figure}[!htb] + \centering \includegraphics[width=12cm]{img/exec_rel} \caption{La interrelazione fra le sei funzioni della famiglia \func{exec}.} \label{fig:proc_exec_relat} \end{figure} @@ -2693,9 +2692,9 @@ priorità statica da assegnare al processo; lo standard prevede che questo debba essere assegnato all'interno di un intervallo fra un massimo ed un minimo che nel caso di Linux sono rispettivamente 1 e 99. -\begin{figure}[!bht] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/sched_param.c} \end{minipage} \normalsize @@ -3109,7 +3108,7 @@ di I/O.\footnote{se usate in corrispondenza ad uno scheduler diverso il loro utilizzo non avrà alcun effetto.} Dato che non esiste una interfaccia diretta nelle \acr{glibc} per queste due funzioni occorrerà invocarle tramite la funzione \func{syscall} (come illustrato in -sez.~\ref{sec:intro_syscall}). Le due funzioni sono \funcd{ioprio\_get} ed +sez.~\ref{sec:proc_syscall}). Le due funzioni sono \funcd{ioprio\_get} ed \funcd{ioprio\_set}; i rispettivi prototipi sono: \begin{functions} \headdecl{linux/ioprio.h} @@ -3288,15 +3287,164 @@ 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} 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 +piuttosto ridotto. Trattandosi di problematiche abbastanza complesse, che +spesso presuppongono la conoscenza di altri argomenti trattati nel seguito +della guida, si può saltare questa sezione in una prima lettura, tornando su di essa in un secondo tempo. \subsection{La system call \func{clone}} \label{sec:process_clone} -Da fare +La funzione tradizionale con cui creare un nuovo processo in un sistema +Unix-like, come illustrato in sez.~\ref{sec:proc_fork}, è \func{fork}, ma con +l'introduzione del supporto del kernel per i \textit{thread} (vedi +cap.~\ref{cha:threads}), si è avuta la necessità di una interfaccia che +consentisse un maggiore controllo sulla modalità con cui vengono creati nuovi +processi, che poi è stata utilizzata anche per fornire supporto per le +tecnologie di virtualizzazione dei processi (i cosiddetti \textit{container}). + +Per questo l'interfaccia per la creazione di un nuovo processo è stata +delegata ad una nuova \textit{system call}, \func{sys\_clone}, che consente di +reimplementare anche la tradizionale \func{fork}. In realtà in questo caso più +che di nuovi processi si può parlare della creazioni di nuovi +``\textit{task}'' del kernel che possono assumere la veste sia di un processo +classico come quelli trattati finora, che di un \textit{thread}, come quelli +che vedremo in sez.~\ref{sec:linux_thread}, in cui la memoria viene condivisa +fra il processo chiamante ed il nuovo processo creato. Per evitare confusione +fra \textit{thread} e processi ordinari, abbiamo deciso di usare la +nomenclatura \textit{task} per indicare la unità di esecuzione generica messa +a disposizione del kernel che \texttt{sys\_clone} permette di creare. + +Oltre a questo la funzione consente, ad uso delle nuove funzionalità di +virtualizzazione dei processi, di creare nuovi \textit{namespace} per una +serie di proprietà generali dei processi (come l'elenco dei PID, l'albero dei +file, dei \textit{mount point}, della rete, ecc.), che consentono di creare +gruppi di processi che vivono in una sorta di spazio separato dagli altri, che +costituisce poi quello che viene chiamato un \textit{container}. + +La \textit{system call} richiede soltanto due argomenti: il +primo, \param{flags}, consente di controllare le modalità di creazione del +nuovo \textit{task}, il secondo, \param{child\_stack}, imposta l'indirizzo +dello \itindex{stack} \textit{stack} per il nuovo \textit{task}, e deve essere +indicato quando si intende creare un \textit{thread}. L'esecuzione del +programma creato da \func{sys\_clone} riprende, come per \func{fork}, da +dopo l'esecuzione della stessa. + +La necessità di avere uno \itindex{stack} \textit{stack} alternativo c'è solo +quando si intende creare un \textit{thread}, in tal caso infatti il nuovo +\textit{task} vede esattamente la stessa memoria del \textit{task} +``\textsl{padre}'',\footnote{in questo caso per padre si intende semplicemente + il \textit{task} che ha eseguito \func{sys\_clone} rispetto al \textit{task} + da essa creato, senza nessuna delle implicazioni che il concetto ha per i + processi.} e nella sua esecuzione alla prima chiamata di una funzione +andrebbe a scrivere sullo \textit{stack} usato anche dal padre (si ricordi +quanto visto in sez.~\ref{sec:proc_mem_layout} riguardo all'uso dello +\textit{stack}). + +Per evitare di doversi garantire contro la evidente possibilità di +\itindex{race~condition} \textit{race condition} che questa situazione +comporta (vedi sez.~\ref{sec:proc_race_cond} per una spiegazione della +problematica) è necessario che il chiamante allochi preventivamente un'area di +memoria. In genere lo si fa con una \func{malloc} che allochi un buffer che +la funzione imposterà come \textit{stack} del nuovo processo, avendo +ovviamente cura di non utilizzarlo direttamente nel processo chiamante. In +questo modo i due \textit{task} avranno degli \textit{stack} indipendenti e +non si dovranno affrontare problematiche di \itindex{race~condition} +\textit{race condition}. Si tenga presente inoltre che in molte architetture +di processore lo \textit{stack} cresce verso il basso, pertanto in tal caso +non si dovrà specificare per \param{child\_stack} il puntatore restituito da +\func{malloc}, ma un puntatore alla fine del buffer da essa allocato. + +Dato che tutto ciò è necessario solo per i \textit{thread} che condividono la +memoria, la \textit{system call}, a differenza della funzione di libreria che +vedremo a breve, consente anche di passare per \param{child\_stack} il valore +\val{NULL}, che non imposta un nuovo \textit{stack}. Se infatti si crea un +processo, questo ottiene un suo nuovo spazio degli indirizzi,\footnote{è + sottinteso cioè che non si stia usando il flag \const{CLONE\_VM}.} ed in +questo caso si applica la semantica del \itindex{copy-on-write} \textit{copy + on write} illustrata in sez.~\ref{sec:proc_fork}, per cui le pagine dello +\textit{stack} verranno automaticamente copiate come le altre e il nuovo +processo avrà un suo \textit{stack} totalmente indipendente da quello del +padre. + +Dato che l'uso principale della nuova \textit{system call} è quello relativo +alla creazione dei \textit{thread}, le \acr{glibc} definiscono una funzione di +libreria con una sintassi diversa, orientata a questo scopo, e la +\textit{system call} resta accessibile solo se invocata esplicitamente come +visto in sez.~\ref{sec:proc_syscall}.\footnote{ed inoltre per questa + \textit{system call} non è disponibile la chiamata veloce con + \texttt{vsyscall}.} La funzione di libreria si chiama semplicemente +\funcd{clone} ed il suo prototipo è: +\begin{functions} + \headdecl{sys/sched.h} + + \funcdecl{int clone(int (*fn)(void *), void *child\_stack, int + flags, void *arg, ... \\ + /* pid\_t *ptid, struct user\_desc *tls, pid\_t *ctid */)} + + Crea un nuovo processo o \textit{thread} eseguendo la funzione \param{fn}. + + \bodydesc{La funzione ritorna al chiamante il \textit{Thread ID} assegnato + al nuovo processo in caso di successo e $-1$ in caso di errore, nel qual + caso \var{errno} può assumere i valori: + \begin{errlist} + \item[\errcode{EAGAIN}] sono già in esecuzione troppi processi. + \item[\errcode{EINVAL}] si è usata una combinazione non valida di flag o + un valore nullo per \param{child\_stack}. + \item[\errcode{ENOMEM}] non c'è memoria sufficiente per creare una nuova + \struct{task\_struct} o per copiare le parti del contesto del chiamante + necessarie al nuovo \textit{task}. + \item[\errcode{EPERM}] non si hanno i privilegi di amministratore + richiesti dai flag indicati. + \end{errlist} + } +\end{functions} + +La funzione prende come primo argomento il puntatore alla funzione che verrà +messa in esecuzione nel nuovo processo, che può avere un unico argomento di +tipo puntatore a \ctyp{void}, il cui valore viene passato dal terzo +argomento \param{arg}; per quanto il precedente prototipo possa intimidire +nella sua espressione, in realtà l'uso è molto semplice basterà definire una +qualunque funzione \param{fn} del tipo indicato, e \code{fn(arg)} sarà +eseguita in un nuovo processo. + +Il nuovo processo resterà in esecuzione fintanto che la funzione \param{fn} +non ritorna, o esegue \func{exit} o viene terminata da un segnale. Il valore +di ritorno della funzione (o quello specificato con \func{exit}) verrà +utilizzato come stato di uscita della funzione. + +I tre argomenti \param{ptid}, \param{tls} e \param{ctid} sono opzionali e sono +presenti solo a partire dal kernel 2.6. + +Il comportamento di \func{clone}, che si riflette sulle caratteristiche del +nuovo processo da essa creato, è controllato dall'argomento \param{flags}, + +\begin{basedescript}{\desclabelstyle{\pushlabel}} + +\item[\const{CLONE\_CHILD\_CLEARTID}] +\item[\const{CLONE\_CHILD\_SETTID}] +\item[\const{CLONE\_FILES}] +\item[\const{CLONE\_FS}] +\item[\const{CLONE\_IO}] +\item[\const{CLONE\_NEWIPC}] +\item[\const{CLONE\_NEWNET}] +\item[\const{CLONE\_NEWNS}] +\item[\const{CLONE\_NEWPID}] +\item[\const{CLONE\_NEWUTS}] +\item[\const{CLONE\_PARENT}] +\item[\const{CLONE\_PARENT\_SETTID}] +\item[\const{CLONE\_PID}] +\item[\const{CLONE\_PTRACE}] +\item[\const{CLONE\_SETTLS}] +\item[\const{CLONE\_SIGHAND}] +\item[\const{CLONE\_STOPPED}] +\item[\const{CLONE\_SYSVSEM}] +\item[\const{CLONE\_THREAD}] +\item[\const{CLONE\_UNTRACED}] +\item[\const{CLONE\_VFORK}] +\item[\const{CLONE\_VM}] +\end{basedescript} + \subsection{La funzione \func{prctl}} \label{sec:process_prctl} @@ -3307,8 +3455,8 @@ 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.} + standardizzata ed è specifica di Linux, anche se ne esiste una analoga in + IRIX; è stata introdotta con il kernel 2.1.57.} \begin{functions} \headdecl{sys/prctl.h} @@ -3345,10 +3493,11 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento: 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. + \const{CAP\_SETPCAP}), altrimenti la chiamata fallirà 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 la + chiamata fallirà 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 @@ -3363,7 +3512,7 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento: 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 + 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 @@ -3378,40 +3527,196 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento: 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). 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. +\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} (vedi sez.~\ref{sec:sig_prog_error}). 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 eccezione + asincrona non recuperabile, \const{PR\_FP\_EXC\_ASYNC} per utilizzare la + modalità di eccezione asincrona recuperabile, \const{PR\_FP\_EXC\_PRECISE} + per la modalità 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 + mantenute, 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 l'uso di \const{PR\_SET\_SECUREBITS} più avanti). 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; 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} (vedi sez.~\ref{sec:sig_termination}). 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 chiamante al valore indicato + da \param{arg2}; per i dettagli sul significato dei \textit{securebits} si + veda sez.~\ref{sec:proc_capabilities}, ed in particolare i valori di + tab.~\ref{tab:securebits_values} e la relativa trattazione. L'operazione + richiede i privilegi di amministratore (la capacità \const{CAP\_SETPCAP}), + altrimenti la chiamata fallirà con un errore di \errval{EPERM}. 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 + chiamante 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} (vedi + sez.~\ref{sec:sig_prog_error}). 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 contattore 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 il + valore \const{PR\_UNALIGN\_NOPRINT} per ignorare gli accessi non allineati, + ed il valore \const{PR\_UNALIGN\_SIGBUS} per generare un segnale di + \const{SIGBUS} (vedi sez.~\ref{sec:sig_prog_error}) 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}] Imposta la politica di gestione degli errori + dovuti a corruzione della memoria per problemi hardware. Questo tipo di + errori vengono riportati dall'hardware di controllo della RAM e vengono + gestiti dal kernel,\footnote{la funzionalità è disponibile solo sulle + piattaforme più avanzate che hanno il supporto hardware per questo tipo di + controlli.} ma devono essere opportunamente riportati ai processi che + usano quella parte di RAM che presenta errori; nel caso specifico questo + avviene attraverso l'emissione di un segnale di \const{SIGBUS} (vedi + sez.~\ref{sec:sig_prog_error}).\footnote{in particolare viene anche + impostato il valore di \var{si\_code} in \struct{siginfo\_t} a + \const{BUS\_MCEERR\_AO}; per il significato di tutto questo si faccia + riferimento alla trattazione di sez.~\ref{sec:sig_sigaction}.} + + Il comportamento di default prevede che per tutti i processi si applichi la + politica generale di sistema definita nel file + \procfile{/proc/sys/vm/memory\_failure\_early\_kill}, ma specificando + per \param{arg2} il valore \const{PR\_MCE\_KILL\_SET} è possibile impostare + con il contenuto di \param{arg3} una politica specifica del processo + chiamante. Si può tornare alla politica di default del sistema utilizzando + invece per \param{arg2} il valore \const{PR\_MCE\_KILL\_CLEAR}. In tutti i + casi, per compatibilità con eventuali estensioni future, tutti i valori + degli argomenti non utilizzati devono essere esplicitamente posti a zero, + pena il fallimento della chiamata con un errore di \errval{EINVAL}. + + In caso di impostazione di una politica specifica del processo con + \const{PR\_MCE\_KILL\_SET} i valori di \param{arg3} possono essere soltanto + due, che corrispondono anche al valore che si trova nell'impostazione + generale di sistema di \texttt{memory\_failure\_early\_kill}, con + \const{PR\_MCE\_KILL\_EARLY} si richiede l'emissione immediata di + \const{SIGBUS} non appena viene rilevato un errore, mentre con + \const{PR\_MCE\_KILL\_LATE} il segnale verrà inviato solo quando il processo + tenterà un accesso alla memoria corrotta. Questi due valori corrispondono + rispettivamente ai valori 1 e 0 di + \texttt{memory\_failure\_early\_kill}.\footnote{in sostanza nel primo caso + viene immediatamente inviato il segnale a tutti i processi che hanno la + memoria corrotta mappata all'interno del loro spazio degli indirizzi, nel + secondo caso prima la pagina di memoria viene tolta dallo spazio degli + indirizzi di ciascun processo, mentre il segnale viene inviato solo quei + processi che tentano di accedervi.} Si può usare per \param{arg3} anche un + terzo valore, \const{PR\_MCE\_KILL\_DEFAULT}, che corrisponde a impostare + per il processo la politica di default.\footnote{si presume la politica di + default corrente, in modo da non essere influenzati da un eventuale + successivo cambiamento della stessa.} Introdotta a partire dal kernel + 2.6.32. +\item[\const{PR\_MCE\_KILL\_GET}] Ottiene come valore di ritorno della + funzione la politica di gestione degli errori dovuti a corruzione della + memoria. Tutti gli argomenti non utilizzati (al momento tutti) devono essere + nulli pena la ricezione di un errore di \errval{EINVAL}. Introdotta a + partire dal kernel 2.6.32. \label{sec:prctl_operation} \end{basedescript} @@ -3423,6 +3728,9 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento: Da fare +% TODO: trattare PTRACE_SEIZE, aggiunta con il kernel 3.1 + + \subsection{L'accesso alle porte di I/O} \label{sec:process_io_port} @@ -3432,6 +3740,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} @@ -3640,10 +3952,15 @@ varie funzioni di libreria, che sono identificate aggiungendo il suffisso % LocalWords: CONTINUED sources forking Spawned successfully executing exiting % LocalWords: next cat for COMMAND pts bash defunct TRAPPED DUMPED Killable PR % LocalWords: SIGKILL static RLIMIT preemption PREEMPT VOLUNTARY IDLE RTPRIO -% LocalWords: Completely Fair compat Uniform CFQ Queuing elevator dev cfq RT -% LocalWords: Documentation block syscall ioprio IPRIO CLASS class best effort -% LocalWords: refresh semop dnotify MADV DONTFORK prctl WCLONE SIGCHL WALL -% LocalWords: WNOTHREAD DUMPABLE KEEPCAPS +% LocalWords: completely fair compat uniform CFQ queuing elevator dev cfq RT +% LocalWords: documentation block syscall ioprio IPRIO CLASS class best effort +% LocalWords: refresh semop dnotify MADV DONTFORK prctl WCLONE WALL big +% LocalWords: WNOTHREAD DUMPABLE KEEPCAPS IRIX CAPBSET endianess endian flags +% LocalWords: little PPC PowerPC FPEMU NOPRINT SIGFPE FPEXC point FP SW malloc +% LocalWords: exception EXC ENABLE OVF overflow UND underflow RES INV DISABLED +% LocalWords: NONRECOV ASYNC KEEP securebits NAME NUL PDEATHSIG SECCOMP VM +% LocalWords: secure computing sigreturn TIMING STATISTICAL TSC MCE conditions +% LocalWords: timestamp Stamp SIGSEGV UNALIGN SIGBUS MCEERR AO failure early %%% Local Variables: %%% mode: latex