X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=prochand.tex;h=27361879e79dadd931019f4f2b42d469e6e8131f;hp=a16a9ae22e9977b8b81f2ea51e5ab0ea779f57c9;hb=fbaf3a4f4f6fe16f6f2233f7165bbfa77557e32e;hpb=7b43a7843d483c826a6ed13224208c615a23c4d6 diff --git a/prochand.tex b/prochand.tex index a16a9ae..2736187 100644 --- a/prochand.tex +++ b/prochand.tex @@ -1,6 +1,6 @@ %% prochand.tex %% -%% Copyright (C) 2000-2015 by Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2016 by Simone Piccardi. Permission is granted to %% copy, distribute and/or modify this document under the terms of the GNU Free %% Documentation License, Version 1.1 or any later version published by the %% Free Software Foundation; with the Invariant Sections being "Un preambolo", @@ -139,14 +139,15 @@ questa tabella, costituita da una struttura \kstruct{task\_struct}, che contiene tutte le informazioni rilevanti per quel processo. Tutte le strutture usate a questo scopo sono dichiarate nell'\textit{header file} \file{linux/sched.h}, ed uno schema semplificato, che riporta la struttura -delle principali informazioni contenute nella \struct{task\_struct} (che in +delle principali informazioni contenute nella \texttt{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} - \caption{Schema semplificato dell'architettura delle strutture usate dal - kernel nella gestione dei processi.} + \caption{Schema semplificato dell'architettura delle strutture ( + \kstructd{task\_struct}, \kstructd{fs\_struct}, \kstructd{file\_struct}) + usate dal kernel nella gestione dei processi.} \label{fig:proc_task_struct} \end{figure} @@ -206,10 +207,10 @@ tradizionalmente il \ids{PID} un numero positivo memorizzato in un intero a 16 bit, arriva ad un massimo di 32768. Oltre questo valore l'assegnazione riparte dal numero più basso disponibile a partire da un minimo di 300,\footnote{questi valori, fino al kernel 2.4.x, erano definiti dalla macro - \const{PID\_MAX} nei file \file{threads.h} e \file{fork.c} dei sorgenti del + \constd{PID\_MAX} nei file \file{threads.h} e \file{fork.c} dei sorgenti del kernel, con il 2.6.x e la nuova interfaccia per i \textit{thread} anche il meccanismo di allocazione dei \ids{PID} è stato modificato ed il valore - massimo è impostabile attraverso il file \sysctlfile{kernel/pid\_max} e di + massimo è impostabile attraverso il file \sysctlfiled{kernel/pid\_max} e di default vale 32768.} che serve a riservare i \ids{PID} più bassi ai processi eseguiti direttamente dal kernel. Per questo motivo, come visto in sez.~\ref{sec:proc_hierarchy}, il processo di avvio (\cmd{init}) ha sempre il @@ -999,12 +1000,12 @@ sono riportate anche le costanti definite per indicare alcuni di essi. $<-1$& -- & Attende per un figlio il cui \textit{process group} (vedi sez.~\ref{sec:sess_proc_group}) è uguale al valore assoluto di \param{pid}.\\ - $-1$&\const{WAIT\_ANY} & Attende per un figlio qualsiasi, usata in - questa maniera senza specificare nessuna opzione - è equivalente a \func{wait}.\\ - $ 0$&\const{WAIT\_MYPGRP}&Attende per un figlio il cui \textit{process + $-1$&\constd{WAIT\_ANY} & Attende per un figlio qualsiasi, usata in + questa maniera senza specificare nessuna opzione + è equivalente a \func{wait}.\\ + $ 0$&\constd{WAIT\_MYPGRP}&Attende per un figlio il cui \textit{process group} (vedi sez.~\ref{sec:sess_proc_group}) è - uguale a quello del processo chiamante.\\ + uguale a quello del processo chiamante.\\ $>0$& -- & Attende per un figlio il cui \ids{PID} è uguale al valore di \param{pid}.\\ \hline @@ -1042,17 +1043,17 @@ sez.~\ref{sec:thread_xxx}). fermato ha ripreso l'esecuzione (disponibile solo a partire dal kernel 2.6.10).\\ \hline - \const{\_\_WCLONE}& Attende solo per i figli creati con \func{clone} + \constd{\_\_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 \signal{SIGCHLD} alla terminazione, il default è attendere soltanto i processi figli ordinari ignorando quelli creati da \func{clone}.\\ - \const{\_\_WALL} & Attende per qualunque figlio, sia ordinario che creato + \constd{\_\_WALL} & Attende per qualunque figlio, sia ordinario che creato con \func{clone}, se specificata insieme a \const{\_\_WCLONE} quest'ultima viene ignorata. \\ - \const{\_\_WNOTHREAD}& Non attende per i figli di altri \textit{thread} + \constd{\_\_WNOTHREAD}& Non attende per i figli di altri \textit{thread} dello stesso \textit{thread group}, questo era il comportamento di default del kernel 2.4 che non supportava la possibilità, divenuta il default a @@ -1065,6 +1066,7 @@ sez.~\ref{sec:thread_xxx}). \label{tab:proc_waitpid_options} \end{table} +\constbeg{WNOHANG} L'uso dell'opzione \const{WNOHANG} consente di prevenire il blocco della funzione qualora nessun figlio sia uscito o non si siano verificate le altre @@ -1072,6 +1074,10 @@ condizioni per l'uscita della funzione. in tal caso. In tal caso la funzione, invece di restituire il \ids{PID} del processo (che è sempre un intero positivo) ritornerà un valore nullo. +\constend{WNOHANG} +\constbeg{WUNTRACED} +\constbeg{WCONTINUED} + Le altre due opzioni, \const{WUNTRACED} e \const{WCONTINUED}, consentono rispettivamente di tracciare non la terminazione di un processo, ma il fatto che esso sia stato fermato, o fatto ripartire, e sono utilizzate per la @@ -1088,6 +1094,9 @@ mentre con \const{WCONTINUED} la funzione ritorna quando un processo in stato \signal{SIGCONT} (l'uso di questi segnali per il controllo di sessione è trattato in sez.~\ref{sec:sess_ctrl_term}). +\constend{WUNTRACED} +\constend{WCONTINUED} + La terminazione di un processo figlio (così come gli altri eventi osservabili con \func{waitpid}) è chiaramente un evento asincrono rispetto all'esecuzione di un programma e può avvenire in un qualunque momento. Per questo motivo, @@ -1148,40 +1157,40 @@ ecc.\footnote{le definizioni esatte si possono trovare in \textbf{Macro} & \textbf{Descrizione}\\ \hline \hline - \macro{WIFEXITED}\texttt{(s)} & Condizione vera (valore non nullo) per + \macrod{WIFEXITED}\texttt{(s)} & Condizione vera (valore non nullo) per un processo figlio che sia terminato normalmente. \\ - \macro{WEXITSTATUS}\texttt{(s)} & Restituisce gli otto bit meno + \macrod{WEXITSTATUS}\texttt{(s)} & Restituisce gli otto bit meno significativi dello stato di uscita del processo (passato attraverso \func{\_exit}, \func{exit} o come valore di ritorno di \code{main}); può essere valutata solo se \val{WIFEXITED} ha restituito un valore non nullo.\\ - \macro{WIFSIGNALED}\texttt{(s)} & Condizione vera se il processo figlio è + \macrod{WIFSIGNALED}\texttt{(s)} & Condizione vera se il processo figlio è terminato in maniera anomala a causa di un segnale che non è stato catturato (vedi sez.~\ref{sec:sig_notification}).\\ - \macro{WTERMSIG}\texttt{(s)} & Restituisce il numero del segnale che ha + \macrod{WTERMSIG}\texttt{(s)} & Restituisce il numero del segnale che ha causato la terminazione anomala del processo; può essere valutata solo se \val{WIFSIGNALED} ha restituito un valore non nullo.\\ - \macro{WCOREDUMP}\texttt{(s)} & Vera se il processo terminato ha + \macrod{WCOREDUMP}\texttt{(s)} & Vera se il processo terminato ha generato un file di \textit{core dump}; può essere valutata solo se \val{WIFSIGNALED} ha restituito un valore non nullo.\footnotemark \\ - \macro{WIFSTOPPED}\texttt{(s)} & Vera se il processo che ha causato il + \macrod{WIFSTOPPED}\texttt{(s)} & Vera se il processo che ha causato il ritorno di \func{waitpid} è bloccato; l'uso è possibile solo con \func{waitpid} avendo specificato l'opzione \const{WUNTRACED}.\\ - \macro{WSTOPSIG}\texttt{(s)} & Restituisce il numero del segnale che ha + \macrod{WSTOPSIG}\texttt{(s)} & Restituisce il numero del segnale che ha bloccato il processo; può essere valutata solo se \val{WIFSTOPPED} ha restituito un valore non nullo. \\ - \macro{WIFCONTINUED}\texttt{(s)}& Vera se il processo che ha causato il + \macrod{WIFCONTINUED}\texttt{(s)}& Vera se il processo che ha causato il ritorno è stato riavviato da un \signal{SIGCONT} (disponibile solo a partire dal kernel 2.6.10).\\ @@ -1249,16 +1258,16 @@ primo, quale processo o quale gruppo di processi selezionare. \textbf{Valore} & \textbf{Descrizione}\\ \hline \hline - \const{P\_PID} & Indica la richiesta di attendere per un processo figlio - il cui \ids{PID} corrisponda al valore dell'argomento - \param{id}.\\ - \const{P\_PGID}& Indica la richiesta di attendere per un processo figlio - appartenente al \textit{process group} (vedi - sez.~\ref{sec:sess_proc_group}) il cui \acr{pgid} - corrisponda al valore dell'argomento \param{id}.\\ - \const{P\_ALL} & Indica la richiesta di attendere per un processo figlio - generico, il valore dell'argomento \param{id} viene - ignorato.\\ + \constd{P\_PID} & Indica la richiesta di attendere per un processo figlio + il cui \ids{PID} corrisponda al valore dell'argomento + \param{id}.\\ + \constd{P\_PGID}& Indica la richiesta di attendere per un processo figlio + appartenente al \textit{process group} (vedi + sez.~\ref{sec:sess_proc_group}) il cui \acr{pgid} + corrisponda al valore dell'argomento \param{id}.\\ + \constd{P\_ALL} & Indica la richiesta di attendere per un processo figlio + generico, il valore dell'argomento \param{id} viene + ignorato.\\ \hline \end{tabular} \caption{Costanti per i valori dell'argomento \param{idtype} della funzione @@ -1286,15 +1295,15 @@ nuovo riceverne lo stato. \textbf{Valore} & \textbf{Descrizione}\\ \hline \hline - \const{WEXITED} & Ritorna quando un processo figlio è terminato.\\ - \const{WNOHANG} & Ritorna immediatamente anche se non c'è niente da - notificare.\\ - \const{WSTOPPED} & Ritorna quando un processo figlio è stato fermato.\\ - \const{WCONTINUED}& Ritorna quando un processo figlio che era stato - fermato ha ripreso l'esecuzione.\\ - \const{WNOWAIT} & Lascia il processo ancora in attesa di ricezione, così - che una successiva chiamata possa di nuovo riceverne - lo stato.\\ + \constd{WEXITED} & Ritorna quando un processo figlio è terminato.\\ + \constd{WNOHANG} & Ritorna immediatamente anche se non c'è niente da + notificare.\\ + \constd{WSTOPPED} & Ritorna quando un processo figlio è stato fermato.\\ + \const{WCONTINUED} & Ritorna quando un processo figlio che era stato + fermato ha ripreso l'esecuzione.\\ + \constd{WNOWAIT} & Lascia il processo ancora in attesa di ricezione, così + che una successiva chiamata possa di nuovo riceverne + lo stato.\\ \hline \end{tabular} \caption{Costanti che identificano i bit dell'argomento \param{options} @@ -1402,7 +1411,7 @@ prototipo è: \cmd{noexec}, o manca il permesso di attraversamento di una delle directory del \textit{pathname}. \item[\errcode{EINVAL}] l'eseguibile ELF ha più di un segmento - \const{PF\_INTERP}, cioè chiede di essere eseguito da più di un + \const{PT\_INTERP}, cioè chiede di essere eseguito da più di un interprete. \item[\errcode{ELIBBAD}] un interprete ELF non è in un formato riconoscibile. @@ -1664,9 +1673,9 @@ del programma per caricare le librerie necessarie ed effettuare il link dell'eseguibile; il formato è ormai in completo disuso, per cui è molto probabile che non il relativo supporto non sia disponibile. Se il programma è in formato ELF per caricare le librerie dinamiche viene usato l'interprete -indicato nel segmento \const{PT\_INTERP} previsto dal formato stesso, in -genere questo è \sysfile{/lib/ld-linux.so.1} per programmi collegati con la -\acr{libc5}, e \sysfile{/lib/ld-linux.so.2} per programmi collegati con la +indicato nel segmento \constd{PT\_INTERP} previsto dal formato stesso, in +genere questo è \sysfiled{/lib/ld-linux.so.1} per programmi collegati con la +\acr{libc5}, e \sysfiled{/lib/ld-linux.so.2} per programmi collegati con la \acr{glibc}. Infine nel caso il programma che si vuole eseguire sia uno script e non un @@ -1685,7 +1694,7 @@ lunghezza massima di 127 caratteri e se questa dimensione viene ecceduta la stringa viene troncata; altri Unix hanno dimensioni massime diverse, e diversi comportamenti, ad esempio FreeBSD esegue la scansione della riga e la divide nei vari argomenti e se è troppo lunga restituisce un errore di -\const{ENAMETOOLONG}; una comparazione dei vari comportamenti sui diversi +\errval{ENAMETOOLONG}; una comparazione dei vari comportamenti sui diversi sistemi unix-like si trova su \url{http://www.in-ulm.de/~mascheck/various/shebang/}. @@ -1851,7 +1860,7 @@ servano di nuovo. Questo in Linux viene fatto usando altri due gruppi di identificatori, il \textit{saved} ed il \textit{filesystem}. Il primo gruppo è lo stesso usato in -SVr4, e previsto dallo standard POSIX quando è definita la costante +SVr4, e previsto dallo standard POSIX quando è definita \macro{\_POSIX\_SAVED\_IDS},\footnote{in caso si abbia a cuore la portabilità del programma su altri Unix è buona norma controllare sempre la disponibilità di queste funzioni controllando se questa costante è @@ -1922,11 +1931,11 @@ dell'utente che ha lanciato il programma, effettuare il lavoro che non necessita di privilegi aggiuntivi, ed eventualmente tornare indietro. Come esempio per chiarire l'uso di queste funzioni prendiamo quello con cui -viene gestito l'accesso al file \sysfile{/var/run/utmp}. In questo file viene +viene gestito l'accesso al file \sysfiled{/var/run/utmp}. In questo file viene registrato chi sta usando il sistema al momento corrente; chiaramente non può essere lasciato aperto in scrittura a qualunque utente, che potrebbe falsificare la registrazione. Per questo motivo questo file (e l'analogo -\sysfile{/var/log/wtmp} su cui vengono registrati login e logout) appartengono +\sysfiled{/var/log/wtmp} su cui vengono registrati login e logout) appartengono ad un gruppo dedicato (in genere \acr{utmp}) ed i programmi che devono accedervi (ad esempio tutti i programmi di terminale in X, o il programma \cmd{screen} che crea terminali multipli su una console) appartengono a questo @@ -2165,7 +2174,7 @@ gruppi supplementari cui un utente può appartenere. Ogni processo può avere almeno \const{NGROUPS\_MAX} gruppi supplementari\footnote{il numero massimo di gruppi secondari può essere ottenuto con \func{sysconf} (vedi sez.~\ref{sec:sys_limits}), leggendo il parametro - \texttt{\_SC\_NGROUPS\_MAX}.} in aggiunta al gruppo primario; questi vengono + \const{\_SC\_NGROUPS\_MAX}.} in aggiunta al gruppo primario; questi vengono ereditati dal processo padre e possono essere cambiati con queste funzioni. La funzione di sistema che permette di leggere i gruppi supplementari @@ -2223,7 +2232,7 @@ dimensioni adeguate. Infine per impostare i gruppi supplementari di un processo ci sono due funzioni, che possono essere usate solo se si hanno i privilegi di amministratore.\footnote{e più precisamente se si ha la \textit{capability} - \macro{CAP\_SETGID}.} La prima delle due è la funzione di sistema + \const{CAP\_SETGID}.} La prima delle due è la funzione di sistema \funcd{setgroups},\footnote{la funzione è definita in BSD e SRv4, ma a differenza di \func{getgroups} non è stata inclusa in POSIX.1-2001, per poterla utilizzare deve essere definita la macro \macro{\_BSD\_SOURCE}.} ed @@ -2272,13 +2281,12 @@ caso \var{errno} assumerà uno dei valori: La funzione esegue la scansione del database dei gruppi (usualmente \conffile{/etc/group}) cercando i gruppi di cui è membro l'utente \param{user} (di nuovo specificato per nome e non per \ids{UID}) con cui costruisce una -lista di gruppi supplementari, a cui aggiunge anche -\param{group}, infine imposta questa lista per il processo corrente usando -\func{setgroups}. Si tenga presente che sia \func{setgroups} che -\func{initgroups} non sono definite nello standard POSIX.1 e che pertanto non -è possibile utilizzarle quando si definisce \macro{\_POSIX\_SOURCE} o si -compila con il flag \cmd{-ansi}, è pertanto meglio evitarle se si vuole -scrivere codice portabile. +lista di gruppi supplementari, a cui aggiunge anche \param{group}, infine +imposta questa lista per il processo corrente usando \func{setgroups}. Si +tenga presente che sia \func{setgroups} che \func{initgroups} non sono +definite nello standard POSIX.1 e che pertanto non è possibile utilizzarle +quando si definisce \macro{\_POSIX\_SOURCE} o si compila con il flag +\cmd{-ansi}, è pertanto meglio evitarle se si vuole scrivere codice portabile. \section{La gestione della priorità dei processi} @@ -2502,6 +2510,9 @@ processo corrente, il suo prototipo è: \end{errlist}} \end{funcproto} +\constbeg{PRIO\_MIN} +\constbeg{PRIO\_MAX} + L'argomento \param{inc} indica l'incremento da effettuare rispetto al valore di \textit{nice} corrente, che può assumere valori compresi fra \const{PRIO\_MIN} e \const{PRIO\_MAX}; nel caso di Linux sono fra $-20$ e @@ -2519,6 +2530,9 @@ priorità di un processo, a partire da questa versione è consentito anche agli utenti normali alzare (entro certi limiti, che vedremo in sez.~\ref{sec:sys_resource_limit}) la priorità dei propri processi. +\constend{PRIO\_MIN} +\constend{PRIO\_MAX} + Gli standard SUSv2 e POSIX.1 prevedono che la funzione ritorni il nuovo valore di \textit{nice} del processo; tuttavia la \textit{system call} di Linux non segue questa convenzione e restituisce sempre $0$ in caso di successo e $-1$ @@ -2563,7 +2577,7 @@ La funzione permette, a seconda di quanto specificato nell'argomento \param{which}, di leggere il valore di \textit{nice} di un processo, di un gruppo di processi (vedi sez.~\ref{sec:sess_proc_group}) o di un utente indicato dall'argomento \param{who}. Nelle vecchie versioni può -essere necessario includere anche \headfile{sys/time.h}, questo non è più +essere necessario includere anche \headfiled{sys/time.h}, questo non è più necessario con versioni recenti delle librerie, ma è comunque utile per portabilità. @@ -2582,10 +2596,10 @@ l'utente correnti. \param{which} & \param{who} & \textbf{Significato} \\ \hline \hline - \const{PRIO\_PROCESS} & \type{pid\_t} & processo \\ - \const{PRIO\_PRGR} & \type{pid\_t} & \textit{process group} (vedi - sez.~\ref{sec:sess_proc_group})\\ - \const{PRIO\_USER} & \type{uid\_t} & utente \\ + \constd{PRIO\_PROCESS} & \type{pid\_t} & processo \\ + \constd{PRIO\_PRGR} & \type{pid\_t} & \textit{process group} (vedi + sez.~\ref{sec:sess_proc_group})\\ + \constd{PRIO\_USER} & \type{uid\_t} & utente \\ \hline \end{tabular} \caption{Legenda del valore dell'argomento \param{which} e del tipo @@ -2778,17 +2792,17 @@ corrente. \textbf{Politica} & \textbf{Significato} \\ \hline \hline - \const{SCHED\_FIFO} & \textit{Scheduling real-time} con politica - \textit{FIFO}. \\ - \const{SCHED\_RR} & \textit{Scheduling real-time} con politica - \textit{Round Robin}. \\ + \constd{SCHED\_FIFO} & \textit{Scheduling real-time} con politica + \textit{FIFO}. \\ + \constd{SCHED\_RR} & \textit{Scheduling real-time} con politica + \textit{Round Robin}. \\ \hline - \const{SCHED\_OTHER}& \textit{Scheduling} ordinario.\\ - \const{SCHED\_BATCH}& \textit{Scheduling} ordinario con l'assunzione - ulteriore di lavoro \textit{CPU - intensive} (dal kernel 2.6.16).\\ - \const{SCHED\_IDLE} & \textit{Scheduling} di priorità estremamente - bassa (dal kernel 2.6.23).\\ + \constd{SCHED\_OTHER}& \textit{Scheduling} ordinario.\\ + \constd{SCHED\_BATCH}& \textit{Scheduling} ordinario con l'assunzione + ulteriore di lavoro \textit{CPU + intensive} (dal kernel 2.6.16).\\ + \constd{SCHED\_IDLE} & \textit{Scheduling} di priorità estremamente + bassa (dal kernel 2.6.23).\\ \hline \end{tabular} \caption{Valori dell'argomento \param{policy} per la funzione @@ -2949,7 +2963,7 @@ politica ordinaria essa ha senso soltanto per quelli \textit{real-time}, dato che per i primi la priorità statica può essere soltanto nulla. La disponibilità di entrambe le funzioni può essere verificata controllando la macro \macro{\_POSIX\_PRIORITY\_SCHEDULING} che è definita nell'\textit{header - file} \headfile{sched.h}. + file} \headfiled{sched.h}. Se invece si vuole sapere quale è politica di \textit{scheduling} di un processo si può usare la funzione di sistema \funcd{sched\_getscheduler}, il @@ -3043,7 +3057,7 @@ l'introduzione del \textit{Completely Fair Scheduler} questo comportamento è cambiato ed un processo che chiama la funzione viene inserito nella lista dei processi inattivo, con un tempo molto maggiore.\footnote{è comunque possibile ripristinare un comportamento analogo al precedente scrivendo il valore 1 - nel file \sysctlfile{kernel/sched\_compat\_yield}.} + nel file \sysctlfiled{kernel/sched\_compat\_yield}.} L'uso delle funzione nella programmazione ordinaria può essere utile e migliorare le prestazioni generali del sistema quando si è appena rilasciata @@ -3184,7 +3198,7 @@ conveniente l'uso dell'affinità di processore. Dato che il numero di processori può variare a seconda delle architetture, per semplificare l'uso dell'argomento \param{mask} la \acr{glibc} ha introdotto un -apposito dato di tipo, \type{cpu\_set\_t},\footnote{questa è una estensione +apposito dato di tipo, \typed{cpu\_set\_t},\footnote{questa è una estensione specifica della \acr{glibc}, da attivare definendo la macro \macro{\_GNU\_SOURCE}, non esiste infatti una standardizzazione per questo tipo di interfaccia e POSIX al momento non prevede nulla al riguardo.} che @@ -3210,14 +3224,17 @@ se esso è già presente in un insieme, sono le seguenti: \vspace{3pt} \begin{funcbox}{ \fhead{sched.h} -\fdecl{void \macro{CPU\_ZERO}(cpu\_set\_t *set)} +\fdecl{void \macrod{CPU\_ZERO}(cpu\_set\_t *set)} \fdesc{Inizializza un insieme di processori vuoto \param{set}.} -\fdecl{void \macro{CPU\_SET}(int cpu, cpu\_set\_t *set)} -\fdesc{Inserisce il processore \param{cpu} nell'insieme di processori \param{set}.} -\fdecl{void \macro{CPU\_CLR}(int cpu, cpu\_set\_t *set)} -\fdesc{Rimuove il processore \param{cpu} nell'insieme di processori \param{set}.} -\fdecl{int \macro{CPU\_ISSET}(int cpu, cpu\_set\_t *set)} -\fdesc{Controlla se il processore \param{cpu} è nell'insieme di processori \param{set}.} +\fdecl{void \macrod{CPU\_SET}(int cpu, cpu\_set\_t *set)} +\fdesc{Inserisce il processore \param{cpu} nell'insieme di + processori \param{set}.} +\fdecl{void \macrod{CPU\_CLR}(int cpu, cpu\_set\_t *set)} +\fdesc{Rimuove il processore \param{cpu} nell'insieme di + processori \param{set}.} +\fdecl{int \macrod{CPU\_ISSET}(int cpu, cpu\_set\_t *set)} +\fdesc{Controlla se il processore \param{cpu} è nell'insieme di + processori \param{set}.} } \end{funcbox}} @@ -3246,7 +3263,7 @@ volte, l'argomento cioè non deve avere \textsl{effetti collaterali} (in gergo Le CPU sono numerate da zero (che indica la prima disponibile) fino ad un numero massimo che dipende dalla architettura hardware. La costante -\const{CPU\_SETSIZE} indica il numero massimo di processori che possono far +\constd{CPU\_SETSIZE} indica il numero massimo di processori che possono far parte di un insieme (al momento vale sempre 1024), e costituisce un limite massimo al valore dell'argomento \param{cpu}. Dalla versione 2.6 della \acr{glibc} alle precedenti macro è stata aggiunta, @@ -3256,7 +3273,7 @@ per contare il numero di processori in un insieme, l'ulteriore: \vspace{3pt} \begin{funcbox}{ \fhead{sched.h} -\fdecl{int \macro{CPU\_COUNT}(cpu\_set\_t *set)} +\fdecl{int \macrod{CPU\_COUNT}(cpu\_set\_t *set)} \fdesc{Conta il numero di processori presenti nell'insieme \param{set}.} } \end{funcbox}} @@ -3269,13 +3286,13 @@ compiere delle operazioni logiche sugli insiemi di processori con: \vspace{3pt} \begin{funcbox}{ \fhead{sched.h} -\fdecl{void \macro{CPU\_AND}(cpu\_set\_t *destset, cpu\_set\_t *srcset1, cpu\_set\_t *srcset2)} +\fdecl{void \macrod{CPU\_AND}(cpu\_set\_t *destset, cpu\_set\_t *srcset1, cpu\_set\_t *srcset2)} \fdesc{Esegue l'AND logico di due insiemi di processori.} -\fdecl{void \macro{CPU\_OR}(cpu\_set\_t *destset, cpu\_set\_t *srcset1, cpu\_set\_t *srcset2)} +\fdecl{void \macrod{CPU\_OR}(cpu\_set\_t *destset, cpu\_set\_t *srcset1, cpu\_set\_t *srcset2)} \fdesc{Esegue l'OR logico di due insiemi di processori.} -\fdecl{void \macro{CPU\_XOR}(cpu\_set\_t *destset, cpu\_set\_t *srcset1, cpu\_set\_t *srcset2)} +\fdecl{void \macrod{CPU\_XOR}(cpu\_set\_t *destset, cpu\_set\_t *srcset1, cpu\_set\_t *srcset2)} \fdesc{Esegue lo XOR logico di due insiemi di processori.} -\fdecl{int \macro{CPU\_EQUAL}(cpu\_set\_t *set1, cpu\_set\_t *set2)} +\fdecl{int \macrod{CPU\_EQUAL}(cpu\_set\_t *set1, cpu\_set\_t *set2)} \fdesc{Verifica se due insiemi di processori sono uguali.} } \end{funcbox}} @@ -3304,11 +3321,11 @@ disallocare ed ottenere la dimensione in byte di un insieme di processori: \vspace{3pt} \begin{funcbox}{ \fhead{sched.h} -\fdecl{cpu\_set\_t * \macro{CPU\_ALLOC}(num\_cpus)} +\fdecl{cpu\_set\_t * \macrod{CPU\_ALLOC}(num\_cpus)} \fdesc{Alloca dinamicamente un insieme di processori di dimensione voluta.} -\fdecl{void \macro{CPU\_FREE}(cpu\_set\_t *set)} +\fdecl{void \macrod{CPU\_FREE}(cpu\_set\_t *set)} \fdesc{Disalloca un insieme di processori allocato dinamicamente.} -\fdecl{size\_t \macro{CPU\_ALLOC\_SIZE}(num\_cpus)} +\fdecl{size\_t \macrod{CPU\_ALLOC\_SIZE}(num\_cpus)} \fdesc{Ritorna la dimensione di un insieme di processori allocato dinamicamente.} } \end{funcbox}} @@ -3453,9 +3470,9 @@ sez.~\ref{sec:sess_proc_group}) o tutti i processi di un utente. \param{which} & \param{who} & \textbf{Significato} \\ \hline \hline - \const{IPRIO\_WHO\_PROCESS} & \type{pid\_t} & processo\\ - \const{IPRIO\_WHO\_PRGR} & \type{pid\_t} & \textit{process group}\\ - \const{IPRIO\_WHO\_USER} & \type{uid\_t} & utente\\ + \constd{IPRIO\_WHO\_PROCESS} & \type{pid\_t} & processo\\ + \constd{IPRIO\_WHO\_PRGR} & \type{pid\_t} & \textit{process group}\\ + \constd{IPRIO\_WHO\_USER} & \type{uid\_t} & utente\\ \hline \end{tabular} \caption{Legenda del valore dell'argomento \param{which} e del tipo @@ -3472,6 +3489,7 @@ di \textit{scheduling} lo prevede, la priorità del processo all'interno della classe stessa. Questo stesso formato viene utilizzato per indicare il valore della priorità da impostare con l'argomento \param{ioprio} di \func{ioprio\_set}. + \begin{table}[htb] \centering \footnotesize @@ -3480,15 +3498,15 @@ della priorità da impostare con l'argomento \param{ioprio} di \textbf{Macro} & \textbf{Significato}\\ \hline \hline - \macro{IOPRIO\_PRIO\_CLASS}\texttt{(\textit{value})} + \macrod{IOPRIO\_PRIO\_CLASS}\texttt{(\textit{value})} & Dato il valore di una priorità come restituito da \func{ioprio\_get} estrae il valore della classe.\\ - \macro{IOPRIO\_PRIO\_DATA}\texttt{(\textit{value})} + \macrod{IOPRIO\_PRIO\_DATA}\texttt{(\textit{value})} & Dato il valore di una priorità come restituito da \func{ioprio\_get} estrae il valore della priorità.\\ - \macro{IOPRIO\_PRIO\_VALUE}\texttt{(\textit{class},\textit{prio})} + \macrod{IOPRIO\_PRIO\_VALUE}\texttt{(\textit{class},\textit{prio})} & Dato un valore di priorità ed una classe ottiene il valore numerico da passare a \func{ioprio\_set}.\\ @@ -3517,9 +3535,11 @@ argomento di \func{ioprio\_set} per eseguire una impostazione. \textbf{Classe} & \textbf{Significato} \\ \hline \hline - \const{IOPRIO\_CLASS\_RT} & \textit{Scheduling} di I/O \textit{real-time}.\\ + \const{IOPRIO\_CLASS\_RT} & \textit{Scheduling} di I/O + \textit{real-time}.\\ \const{IOPRIO\_CLASS\_BE} & \textit{Scheduling} di I/O ordinario.\\ - \const{IOPRIO\_CLASS\_IDLE}& \textit{Scheduling} di I/O di priorità minima.\\ + \const{IOPRIO\_CLASS\_IDLE}& \textit{Scheduling} di I/O di priorità + minima.\\ \hline \end{tabular} \caption{Costanti che identificano le classi di \textit{scheduling} di I/O.} @@ -3532,7 +3552,7 @@ a quelle già adottate anche nel funzionamento dello \textit{scheduler} del processore. Ciascuna di esse è identificata tramite una opportuna costante, secondo quanto riportato in tab.~\ref{tab:IOsched_class}. -La classe di priorità più bassa è \const{IOPRIO\_CLASS\_IDLE}; i processi in +La classe di priorità più bassa è \constd{IOPRIO\_CLASS\_IDLE}; i processi in questa classe riescono ad accedere a disco soltanto quando nessun altro processo richiede l'accesso. Occorre pertanto usarla con molta attenzione, perché un processo in questa classe può venire completamente bloccato quando @@ -3541,7 +3561,7 @@ accedendo al disco. Quando si usa questa classe non ha senso indicare un valore di priorità, dato che in questo caso non esiste nessuna gerarchia e la priorità è identica, la minima possibile, per tutti i processi. -La seconda classe di priorità di I/O è \const{IOPRIO\_CLASS\_BE} (il nome sta +La seconda classe di priorità di I/O è \constd{IOPRIO\_CLASS\_BE} (il nome sta per \textit{best-effort}) che è quella usata ordinariamente da tutti processi. In questo caso esistono priorità diverse che consentono di assegnazione di una maggiore banda passante nell'accesso a disco ad un @@ -3554,7 +3574,7 @@ priorità maggiore. Infine la classe di priorità di I/O \textit{real-time} -\const{IOPRIO\_CLASS\_RT} ricalca le omonime priorità di processore: un +\constd{IOPRIO\_CLASS\_RT} ricalca le omonime priorità di processore: un processo in questa classe ha sempre la precedenza nell'accesso a disco rispetto a tutti i processi delle altre classi e di un processo nella stessa classe ma con priorità inferiore, ed è pertanto in grado di bloccare @@ -3629,8 +3649,8 @@ l'operazione, e deve essere specificato con l'uso di una delle costanti predefinite del seguente elenco, che illustra quelle disponibili al momento:\footnote{alla stesura di questa sezione, cioè con il kernel 3.2.} -\begin{basedescript}{\desclabelwidth{2.cm}\desclabelstyle{\nextlinelabel}} -\item[\const{PR\_CAPBSET\_READ}] Controlla la disponibilità di una delle +\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}} +\item[\constd{PR\_CAPBSET\_READ}] Controlla la disponibilità di una delle \textit{capability} (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 @@ -3638,7 +3658,7 @@ momento:\footnote{alla stesura di questa sezione, cioè con il kernel 3.2.} 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 +\item[\constd{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 @@ -3650,7 +3670,7 @@ momento:\footnote{alla stesura di questa sezione, cioè con il kernel 3.2.} 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 +\item[\constd{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 \textit{core dump} (vedi sez.~\ref{sec:sig_standard}) lo genera effettivamente. In genere questo flag @@ -3671,64 +3691,64 @@ momento:\footnote{alla stesura di questa sezione, cioè con il kernel 3.2.} \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 +\item[\constd{PR\_GET\_DUMPABLE}] Ottiene come valore di ritorno della funzione lo stato corrente del flag che controlla la effettiva generazione dei \textit{core dump}. Introdotta a partire dal kernel 2.3.20. -\item[\const{PR\_SET\_ENDIAN}] Imposta la \textit{endianness} del processo +\item[\constd{PR\_SET\_ENDIAN}] Imposta la \textit{endianness} 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 + sono: \constd{PR\_ENDIAN\_BIG} (\textit{big endian}), + \constd{PR\_ENDIAN\_LITTLE} (\textit{little endian}), e + \constd{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{endianness} del +\item[\constd{PR\_GET\_ENDIAN}] Ottiene il valore della \textit{endianness} del processo chiamante, salvato sulla variabile puntata da \param{arg2} che deve essere passata come di tipo ``\ctyp{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 +\item[\constd{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 + di \param{arg2}, si deve passare \constd{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 + \constd{PR\_FPEMU\_SIGFPE} per non emularle ed inviare il segnale \signal{SIGFPE} (vedi sez.~\ref{sec:sig_prog_error}). Introdotta a partire dal kernel 2.4.18, solo su architettura ia64. -\item[\const{PR\_GET\_FPEMU}] Ottiene il valore dei flag di controllo +\item[\constd{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 ``\ctyp{int *}''. Introdotta a partire dal kernel 2.4.18, solo su architettura ia64. -\item[\const{PR\_SET\_FPEXC}] Imposta la modalità delle eccezioni in virgola +\item[\constd{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: \begin{itemize*} - \item \const{PR\_FP\_EXC\_SW\_ENABLE} per usare FPEXC per le eccezioni, - \item \const{PR\_FP\_EXC\_DIV} per la divisione per zero in virgola mobile, - \item \const{PR\_FP\_EXC\_OVF} per gli overflow, - \item \const{PR\_FP\_EXC\_UND} per gli underflow, - \item \const{PR\_FP\_EXC\_RES} per risultati non esatti, - \item \const{PR\_FP\_EXC\_INV} per operazioni invalide, - \item \const{PR\_FP\_EXC\_DISABLED} per disabilitare le eccezioni, - \item \const{PR\_FP\_EXC\_NONRECOV} per usare la modalità di eccezione + \item \constd{PR\_FP\_EXC\_SW\_ENABLE} per usare FPEXC per le eccezioni, + \item \constd{PR\_FP\_EXC\_DIV} per la divisione per zero in virgola mobile, + \item \constd{PR\_FP\_EXC\_OVF} per gli overflow, + \item \constd{PR\_FP\_EXC\_UND} per gli underflow, + \item \constd{PR\_FP\_EXC\_RES} per risultati non esatti, + \item \constd{PR\_FP\_EXC\_INV} per operazioni invalide, + \item \constd{PR\_FP\_EXC\_DISABLED} per disabilitare le eccezioni, + \item \constd{PR\_FP\_EXC\_NONRECOV} per usare la modalità di eccezione asincrona non recuperabile, - \item \const{PR\_FP\_EXC\_ASYNC} per usare la modalità di eccezione + \item \constd{PR\_FP\_EXC\_ASYNC} per usare la modalità di eccezione asincrona recuperabile, - \item \const{PR\_FP\_EXC\_PRECISE} per la modalità precisa di + \item \constd{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.} \end{itemize*} Introdotta a partire dal kernel 2.4.21, solo su PowerPC. -\item[\const{PR\_GET\_FPEXC}] Ottiene il valore della modalità delle eccezioni +\item[\constd{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 ``\ctyp{int *}''. Introdotta a partire dal kernel 2.4.21, solo su PowerPC. -\item[\const{PR\_SET\_KEEPCAPS}] Consente di controllare quali +\item[\constd{PR\_SET\_KEEPCAPS}] Consente di controllare quali \textit{capabilities} vengono cancellate quando si esegue un cambiamento di \ids{UID} del processo (per i dettagli si veda sez.~\ref{sec:proc_capabilities}, in particolare quanto illustrato a @@ -3740,21 +3760,21 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. sez.~\ref{sec:proc_capabilities} e 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 +\item[\constd{PR\_GET\_KEEPCAPS}] Ottiene come valore di ritorno della funzione il valore del flag di controllo delle \textit{capabilities} 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 +\item[\constd{PR\_SET\_NAME}] Imposta il nome del processo chiamante alla stringa puntata da \param{arg2}, che deve essere di tipo ``\ctyp{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 +\item[\constd{PR\_GET\_NAME}] Ottiene il nome del processo chiamante nella stringa puntata da \param{arg2}, che deve essere di tipo ``\ctyp{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 +\item[\constd{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 \signal{SIGCHLD}. Il valore di \param{arg2} deve indicare il @@ -3762,13 +3782,13 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. 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 +\item[\constd{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 ``\ctyp{int *}''. Introdotta a partire dal kernel 2.3.15. \itindbeg{secure~computing~mode} -\item[\const{PR\_SET\_SECCOMP}] Imposta il cosiddetto \textit{secure computing +\item[\constd{PR\_SET\_SECCOMP}] Imposta il cosiddetto \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 @@ -3794,7 +3814,7 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. % TODO a partire dal kernel 3.17 è stata introdotta la nuova syscall seccomp, % vedi http://lwn.net/Articles/600250/ e http://lwn.net/Articles/603321/ -\item[\const{PR\_GET\_SECCOMP}] Ottiene come valore di ritorno della funzione +\item[\constd{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} @@ -3802,7 +3822,7 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. eventuali estensioni future. Introdotta a partire dal kernel 2.6.23. \itindend{secure~computing~mode} -\item[\const{PR\_SET\_SECUREBITS}] Imposta i \textit{securebits} per il +\item[\constd{PR\_SET\_SECUREBITS}] Imposta i \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 @@ -3811,35 +3831,35 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. 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 +\item[\constd{PR\_GET\_SECUREBITS}] Ottiene come valore di ritorno della funzione l'impostazione corrente per i \textit{securebits}. Introdotta a partire dal kernel 2.6.26. -\item[\const{PR\_SET\_TIMING}] Imposta il metodo di temporizzazione del +\item[\constd{PR\_SET\_TIMING}] Imposta il metodo di temporizzazione del processo da indicare con il valore di \param{arg2}, attualmente i valori - possibili sono due, con \const{PR\_TIMING\_STATISTICAL} si usa il metodo - statistico tradizionale, con \const{PR\_TIMING\_TIMESTAMP} il più accurato + possibili sono due, con \constd{PR\_TIMING\_STATISTICAL} si usa il metodo + statistico tradizionale, con \constd{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 +\item[\constd{PR\_GET\_TIMING}] Ottiene come valore di ritorno della funzione il metodo di temporizzazione del processo attualmente in uso (uno dei due valori citati per \const{PR\_SET\_TIMING}). Introdotta a partire dal kernel 2.6.0-test4. -\item[\const{PR\_SET\_TSC}] Imposta il flag che indica se il processo +\item[\constd{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 + valore di \param{arg2}. Si deve specificare \constd{PR\_TSC\_ENABLE} per + abilitare la lettura o \constd{PR\_TSC\_SIGSEGV} per disabilitarla con la generazione di un segnale di \signal{SIGSEGV} (vedi sez.~\ref{sec:sig_prog_error}). La lettura viene automaticamente disabilitata se si attiva il \textit{secure computing mode} (vedi \const{PR\_SET\_SECCOMP} più avanti). Introdotta a partire dal kernel 2.6.26, solo su x86. -\item[\const{PR\_GET\_TSC}] Ottiene il valore del flag che controlla la +\item[\constd{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 ``\ctyp{int *}''. Introdotta a partire dal kernel 2.6.26, solo su x86. @@ -3847,11 +3867,11 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. % 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 +\item[\constd{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 + valore \constd{PR\_UNALIGN\_NOPRINT} per ignorare gli accessi non allineati, + ed il valore \constd{PR\_UNALIGN\_SIGBUS} per generare un segnale di \signal{SIGBUS} (vedi sez.~\ref{sec:sig_prog_error}) in caso di accesso non allineato. Introdotta con diverse versioni su diverse architetture. @@ -3874,11 +3894,11 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. Il comportamento di default prevede che per tutti i processi si applichi la politica generale di sistema definita nel file - \sysctlfile{vm/memory\_failure\_early\_kill}, ma specificando - per \param{arg2} il valore \const{PR\_MCE\_KILL\_SET} è possibile impostare + \sysctlfiled{vm/memory\_failure\_early\_kill}, ma specificando + per \param{arg2} il valore \constd{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 + invece per \param{arg2} il valore \constd{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}. @@ -3887,9 +3907,9 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. \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 + \constd{PR\_MCE\_KILL\_EARLY} si richiede l'emissione immediata di \signal{SIGBUS} non appena viene rilevato un errore, mentre con - \const{PR\_MCE\_KILL\_LATE} il segnale verrà inviato solo quando il processo + \constd{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 @@ -3898,18 +3918,18 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. 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 + terzo valore, \constd{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 +\item[\constd{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. \itindbeg{child~reaper} -\item[\const{PR\_SET\_CHILD\_SUBREAPER}] Se \param{arg2} è diverso da zero +\item[\constd{PR\_SET\_CHILD\_SUBREAPER}] Se \param{arg2} è diverso da zero imposta l'attributo di \textit{child reaper} per il processo, se nullo lo cancella. Lo stato di \textit{child reaper} è una funzionalità, introdotta con il kernel 3.4, che consente di far svolgere al processo che ha questo @@ -3926,7 +3946,7 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. con lo stato di \textit{child reaper} termina prima dei suoi discendenti, svolgerà questo ruolo il più prossimo antenato ad avere lo stato di \textit{child reaper}, -\item[\const{PR\_GET\_CHILD\_SUBREAPER}] Ottiene l'impostazione relativa allo +\item[\constd{PR\_GET\_CHILD\_SUBREAPER}] Ottiene l'impostazione relativa allo lo stato di \textit{child reaper} del processo chiamante, salvata come \textit{value result} all'indirizzo puntato da \param{arg2} (da indicare come di tipo \code{int *}). Il valore viene letto come valore logico, se @@ -3952,7 +3972,6 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. \end{basedescript} - \subsection{La \textit{system call} \func{clone}} \label{sec:process_clone} @@ -3977,12 +3996,21 @@ 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. +\itindbeg{namespace} +\itindbeg{container} + 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 \ids{PID}, -l'albero dei file, i \textit{mount point}, la 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}. +virtualizzazione dei processi, di creare nuovi ``\textit{namespace}'' per una +serie di proprietà generali (come l'elenco dei \ids{PID}, l'albero dei file, i +\textit{mount point}, la rete, il sistema di IPC, ecc.). L'uso dei +``\textit{namespace}'' consente creare gruppi di processi che vedono le +suddette proprietà in maniera indipendente fra loro. I processi di ciascun +gruppo vengono così eseguiti come in una sorta di spazio separato da quello +degli altri gruppi, che costituisce poi quello che viene chiamato un +\textit{container}. + +\itindend{namespace} +\itindend{container} La \textit{system call} richiede soltanto due argomenti: il primo, \param{flags}, consente di controllare le modalità di creazione del @@ -4053,7 +4081,7 @@ visto in sez.~\ref{sec:proc_syscall}.\footnote{ed inoltre per questa \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 + \texttt{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. @@ -4097,16 +4125,20 @@ elenco, che illustra quelle attualmente disponibili:\footnote{si fa riferimento al momento della stesura di questa sezione, cioè con il kernel 3.2.} -\begin{basedescript}{\desclabelwidth{2.cm}\desclabelstyle{\nextlinelabel}} +\begin{basedescript}{\desclabelwidth{1.5 cm}\desclabelstyle{\nextlinelabel}} + +\item[\constd{CLONE\_CHILD\_CLEARTID}] cancella il valore del \textit{thread + ID} posto all'indirizzo dato dall'argomento \param{ctid}, eseguendo un + riattivazione del \textit{futex} (vedi sez.~\ref{sec:xxx_futex}) a + quell'indirizzo. Questo flag viene utilizzato dalla librerie di gestione dei + \textit{thread} ed è presente dal kernel 2.5.49. -\item[\const{CLONE\_CHILD\_CLEARTID}] cancella il valore del \ids{TID} - all'indirizzo dato dall'argomento \param{ctid}, eseguendo un riattivazione - del \textit{futex} (vedi sez.~\ref{sec:xxx_futex}) a quell'indirizzo; questo - flag viene utilizzato dalla librerie di gestione dei \textit{thread}. -\item[\const{CLONE\_CHILD\_SETTID}] scrive il \ids{TID} del \textit{thread} +\item[\constd{CLONE\_CHILD\_SETTID}] scrive il \ids{TID} del \textit{thread} figlio all'indirizzo dato dall'argomento \param{ctid}. Questo flag viene - utilizzato dalla librerie di gestione dei \textit{thread}. -\item[\const{CLONE\_FILES}] se impostato il nuovo processo condividerà con il + utilizzato dalla librerie di gestione dei \textit{thread} ed è presente dal + kernel 2.5.49. + +\item[\constd{CLONE\_FILES}] se impostato il nuovo processo condividerà con il padre la \textit{file descriptor table} (vedi sez.~\ref{sec:file_fd}), questo significa che ogni \textit{file descriptor} aperto da un processo verrà visto anche dall'altro e che ogni chiusura o cambiamento dei @@ -4119,7 +4151,7 @@ elenco, che illustra quelle attualmente disponibili:\footnote{si fa ordinario di un sistema unix-like e che illustreremo in dettaglio in sez.~\ref{sec:file_shared_access}. -\item[\const{CLONE\_FS}] se questo flag viene impostato il nuovo processo +\item[\constd{CLONE\_FS}] se questo flag viene impostato il nuovo processo condividerà con il padre le informazioni relative all'albero dei file, ed in particolare avrà la stessa radice (vedi sez.~\ref{sec:file_chroot}), la stessa directory di lavoro (vedi sez.~\ref{sec:file_work_dir}) e la stessa @@ -4129,37 +4161,97 @@ elenco, che illustra quelle attualmente disponibili:\footnote{si fa informazioni, che saranno così indipendenti per i due processi, come avviene nel comportamento ordinario di un sistema unix-like. -\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}] +\item[\constd{CLONE\_IO}] se questo flag viene impostato il nuovo il nuovo + processo condividerà con il padre il contesto dell'I/O, altrimenti, come + come avviene nel comportamento ordinario con una \func{fork} otterrà un suo + contesto dell'I/O. + + Il contesto dell'I/O viene usato dagli \textit{scheduler} di I/O (visti in + sez.~\ref{sec:io_priority}) e se questo è lo stesso per diversi processi + questi vengono trattati come se fossero lo stesso, condividendo il tempo per + l'accesso al disco, e possono interscambiarsi nell'accesso a disco. L'uso di + questo flag consente, quando più \textit{thread} eseguono dell'I/O per conto + dello stesso processo (ad esempio con le funzioni di I/O asincrono di + sez.~\ref{sec:file_asyncronous_io}), migliori prestazioni. + +%TODO : tutti i CLONE_NEW* attengono ai namespace, ed è meglio metterli nella +%relativa sezione da creare a parte + +% \item[\constd{CLONE\_NEWIPC}] è uno dei flag ad uso dei \textit{container}, +% introdotto con il kernel 2.6.19. L'uso di questo flag crea per il nuovo +% processo un nuovo \textit{namespace} per il sistema di IPC, sia per quello +% di SysV (vedi sez.~\ref{sec:ipc_sysv}) che, dal kernel 2.6.30, per le code +% di messaggi POSIX (vedi sez.~\ref{sec:ipc_posix_mq}); si applica cioè a +% tutti quegli oggetti che non vegono identificati con un \textit{pathname} +% sull'albero dei file. + +% L'uso di questo flag richiede privilegi di amministratore (più precisamente +% la capacità \const{CAP\_SYS\_ADMIN}) e non può essere usato in combinazione +% con \const{CLONE\_SYSVSEM}. + +% \item[\constd{CLONE\_NEWNET}] +% \item[\constd{CLONE\_NEWNS}] +% \item[\constd{CLONE\_NEWPID}] +% \item[\constd{CLONE\_NEWUTS}] + + +% TODO trattare CLONE_NEWCGROUP introdotto con il kernel 4.6, vedi +% http://lwn.net/Articles/680566/ + +\item[\constd{CLONE\_PARENT}] +\item[\constd{CLONE\_PARENT\_SETTID}] +\item[\constd{CLONE\_PID}] + +\item[\constd{CLONE\_PTRACE}] se questo flag viene impostato ed il processo + chiamante viene tracciato (vedi sez.~\ref{sec:process_ptrace}) anche il + figlio viene tracciato. + +\item[\constd{CLONE\_SETTLS}] +\item[\constd{CLONE\_SIGHAND}] +\item[\constd{CLONE\_STOPPED}] +\item[\constd{CLONE\_SYSVSEM}] +\item[\constd{CLONE\_THREAD}] + +\item[\constd{CLONE\_UNTRACED}] se questo flag viene impostato un processo non + può più forzare \const{CLONE\_PTRACE} su questo processo. + +\item[\constd{CLONE\_VFORK}] se questo flag viene impostato il chiamante viene + fermato fintato che il figlio appena creato non rilascia la sua memoria + virtuale con una chiamata a \func{exec} o \func{exit}, viene quindi + replicato il comportamento di \func{vfork}. + +\item[\constd{CLONE\_VM}] se questo flag viene impostato il nuovo processo + condividerà con il padre la stessa memoria virtuale, e le scritture in + memoria fatte da uno qualunque dei processi saranno visibili dall'altro, + così come ogni mappatura in memoria (vedi sez.~\ref{sec:file_memory_map}). + + Se non viene impostato il processo figlio otterrà una copia dello spazio + degli indirizzi e si otterrà il comportamento ordinario di un processo di un + sistema unix-like creato con la funzione \func{fork}. \end{basedescript} +%TODO sezione separata sui namespace + %TODO trattare unshare, vedi anche http://lwn.net/Articles/532748/ +%TODO: trattare la funzione setns e i namespace file descriptors (vedi +% http://lwn.net/Articles/407495/) introdotti con il kernel 3.0, altre +% informazioni su setns qui: http://lwn.net/Articles/532748/ +% http://lwn.net/Articles/531498/ + + +% TODO trattare le funzioni di protezione della memoria pkey_alloc, pkey_free, +% pkey_mprotect, introdotte con il kernel 4.8, vedi +% http://lwn.net/Articles/689395/ e Documentation/x86/protection-keys.txt %TODO trattare kcmp aggiunta con il kernel 3.5, vedi % https://lwn.net/Articles/478111/ -\subsection{La funzione \func{ptrace}} -\label{sec:process_ptrace} +%\subsection{La funzione \func{ptrace}} +%\label{sec:process_ptrace} -Da fare +%Da fare % TODO: trattare PTRACE_SEIZE, aggiunta con il kernel 3.1 % TODO: trattare PTRACE_O_EXITKILL, aggiunta con il kernel 3.8 (vedi @@ -4169,18 +4261,18 @@ Da fare % TODO: trattare PTRACE_O_SUSPEND_SECCOMP, aggiunta con il kernel 4.3, vedi % http://lwn.net/Articles/656675/ -\subsection{La gestione delle operazioni in virgola mobile} -\label{sec:process_fenv} +%\subsection{La gestione delle operazioni in virgola mobile} +%\label{sec:process_fenv} -Da fare. +%Da fare. % TODO eccezioni ed arrotondamenti per la matematica in virgola mobile % consultare la manpage di fenv, math_error, fpclassify, matherr, isgreater, % isnan, nan, INFINITY -\subsection{L'accesso alle porte di I/O} -\label{sec:process_io_port} +%\subsection{L'accesso alle porte di I/O} +%\label{sec:process_io_port} % % TODO l'I/O sulle porte di I/O @@ -4188,7 +4280,7 @@ Da fare. % non c'entra nulla qui, va trovato un altro posto (altri meccanismi di I/O in % fileintro ?) -Da fare +%Da fare %\subsection{La gestione di architetture a nodi multipli} @@ -4276,14 +4368,14 @@ operazione è messa in discussione, per cui l'assenza di eventuali \textit{race condition} (vedi sez.~\ref{sec:proc_race_cond}) deve essere sempre verificata nei minimi dettagli. -In questo caso il sistema provvede un tipo di dato, il \type{sig\_atomic\_t}, +In questo caso il sistema provvede un tipo di dato, il \typed{sig\_atomic\_t}, il cui accesso è assicurato essere atomico. In pratica comunque si può assumere che, in ogni piattaforma su cui è implementato Linux, il tipo \ctyp{int}, gli altri interi di dimensione inferiore ed i puntatori sono atomici. Non è affatto detto che lo stesso valga per interi di dimensioni maggiori (in cui l'accesso può comportare più istruzioni in assembler) o per le strutture di dati. In tutti questi casi è anche opportuno marcare come -\direct{volatile} le variabili che possono essere interessate ad accesso +\dirct{volatile} le variabili che possono essere interessate ad accesso condiviso, onde evitare problemi con le ottimizzazioni del codice. @@ -4424,7 +4516,7 @@ varie funzioni di libreria, che sono identificate aggiungendo il suffisso % LocalWords: setreuid setregid FIXME ruid rgid seteuid setegid setresuid size % LocalWords: setresgid getresuid getresgid value result argument setfsuid DAC % LocalWords: setfsgid NGROUPS sysconf getgroups getgrouplist groups ngroups -% LocalWords: setgroups initgroups patch LIDS CHOWN OVERRIDE Discrectionary PF +% LocalWords: setgroups initgroups patch LIDS CHOWN OVERRIDE Discrectionary % LocalWords: SEARCH chattr sticky NOATIME socket domain immutable append mmap % LocalWords: broadcast multicast multicasting memory locking mlock mlockall % LocalWords: shmctl ioperm iopl chroot ptrace accounting swap reboot hangup