%% 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",
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}
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
$<-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
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
\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
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
\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,
\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).\\
\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
\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}
\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.
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
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/}.
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 è
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
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
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
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}
\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
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$
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à.
\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
\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
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
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
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
\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}}
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,
\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}}
\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}}
\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}}
\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
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
\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}.\\
\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.}
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
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
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
momento:\footnote{alla stesura di questa sezione, cioè con il kernel 3.2.}
\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
-\item[\const{PR\_CAPBSET\_READ}] Controlla la disponibilità di una delle
+\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
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
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
\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
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
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
% 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}
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
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.
% 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.
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}.
\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
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
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
\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.
\begin{basedescript}{\desclabelwidth{1.5 cm}\desclabelstyle{\nextlinelabel}}
-\item[\const{CLONE\_CHILD\_CLEARTID}] cancella il valore del \textit{thread
+\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\_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} ed è presente dal
kernel 2.5.49.
-\item[\const{CLONE\_FILES}] se impostato il nuovo processo condividerà con il
+\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
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
informazioni, che saranno così indipendenti per i due processi, come avviene
nel comportamento ordinario di un sistema unix-like.
-\item[\const{CLONE\_IO}] se questo flag viene impostato il nuovo il nuovo
+\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.
%TODO : tutti i CLONE_NEW* attengono ai namespace, ed è meglio metterli nella
%relativa sezione da creare a parte
-% \item[\const{CLONE\_NEWIPC}] è uno dei flag ad uso dei \textit{container},
+% \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
% la capacità \const{CAP\_SYS\_ADMIN}) e non può essere usato in combinazione
% con \const{CLONE\_SYSVSEM}.
-% \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}] se questo flag viene impostato il nuovo processo
+% \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}).
% 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/
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.
% 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