%% prochand.tex
%%
-%% Copyright (C) 2000-2015 by Simone Piccardi. Permission is granted to
+%% Copyright (C) 2000-2018 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",
\subsection{L'architettura della gestione dei processi}
\label{sec:proc_hierarchy}
-A differenza di quanto avviene in altri sistemi, ad esempio nel VMS la
+A differenza di quanto avviene in altri sistemi, ad esempio nel VMS, dove la
generazione di nuovi processi è un'operazione privilegiata, una delle
caratteristiche fondanti di Unix, che esamineremo in dettaglio più avanti, è
che qualunque processo può a sua volta generarne altri. Ogni processo è
identificato presso il sistema da un numero univoco, il cosiddetto
-\textit{Process ID} o, più brevemente, \ids{PID}, assegnato in forma
+\textit{Process ID}, o più brevemente \ids{PID}, assegnato in forma
progressiva (vedi sez.~\ref{sec:proc_pid}) quando il processo viene creato.
Una seconda caratteristica di un sistema unix-like è che la generazione di un
Una terza caratteristica del sistema è che ogni processo è sempre stato
generato da un altro processo, il processo generato viene chiamato
\textit{processo figlio} (\textit{child process}) mentre quello che lo ha
-viene chiamato \textsl{processo padre} (\textit{parent process}). Questo vale
-per tutti i processi, con una sola eccezione, dato che ci deve essere un punto
-di partenza esiste un processo speciale (che normalmente è \cmd{/sbin/init}),
-che come abbiamo accennato in sez.~\ref{sec:intro_kern_and_sys} viene lanciato
-dal kernel alla conclusione della fase di avvio. Essendo questo il primo
-processo lanciato dal sistema ha sempre il \ids{PID} uguale a 1 e non è figlio
-di nessun altro processo.
-
-Ovviamente \cmd{init} è un processo speciale che in genere si occupa di far
-partire tutti gli altri processi necessari al funzionamento del sistema,
+generato viene chiamato \textsl{processo padre} (\textit{parent
+ process}). Questo vale per tutti i processi, con una sola eccezione; dato
+che ci deve essere un punto di partenza esiste un processo iniziale (che
+normalmente è \cmd{/sbin/init}), che come accennato in
+sez.~\ref{sec:intro_kern_and_sys} viene lanciato dal kernel alla conclusione
+della fase di avvio. Essendo questo il primo processo lanciato dal sistema ha
+sempre \ids{PID} uguale a 1 e non è figlio di nessun altro processo.
+
+Ovviamente \cmd{init} è un processo particolare che in genere si occupa di
+lanciare tutti gli altri processi necessari al funzionamento del sistema,
inoltre \cmd{init} è essenziale per svolgere una serie di compiti
amministrativi nelle operazioni ordinarie del sistema (torneremo su alcuni di
essi in sez.~\ref{sec:proc_termination}) e non può mai essere terminato. La
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
-seguito incontreremo a più riprese), è mostrato in
-fig.~\ref{fig:proc_task_struct}.
+\file{linux/sched.h}, ed in fig.~\ref{fig:proc_task_struct} si è riportato uno
+schema semplificato che mostra la struttura delle principali informazioni
+contenute nella \texttt{task\_struct}, che in seguito incontreremo a più
+riprese.
\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}
dell'energia da parte del processore che può essere messo in stato di
sospensione anche per lunghi periodi di tempo.
-Indipendentemente dalle motivazioni per cui questo avviene, ogni volta che
+Ma, indipendentemente dalle motivazioni per cui questo avviene, ogni volta che
viene eseguito lo \textit{scheduler} effettua il calcolo delle priorità dei
vari processi attivi (torneremo su questo in sez.~\ref{sec:proc_priority}) e
stabilisce quale di essi debba essere posto in esecuzione fino alla successiva
Come accennato nella sezione precedente ogni processo viene identificato dal
sistema da un numero identificativo univoco, il \textit{process ID} o
-\ids{PID}. Questo è un tipo di dato standard, \type{pid\_t} che in genere è un
+\ids{PID}. Questo è un tipo di dato standard, \type{pid\_t}, che in genere è un
intero con segno (nel caso di Linux e della \acr{glibc} il tipo usato è
\ctyp{int}).
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
\subsection{La funzione \func{fork} e le funzioni di creazione dei processi}
\label{sec:proc_fork}
-La funzione di sistema \funcd{fork} è la funzione fondamentale della gestione
+La funzione di sistema \func{fork} è la funzione fondamentale della gestione
dei processi: come si è detto tradizionalmente l'unico modo di creare un nuovo
processo era attraverso l'uso di questa funzione,\footnote{in realtà oggi la
\textit{system call} usata da Linux per creare nuovi processi è \func{clone}
migliore interazione coi \textit{thread}.} essa quindi riveste un ruolo
centrale tutte le volte che si devono scrivere programmi che usano il
multitasking.\footnote{oggi questa rilevanza, con la diffusione dell'uso dei
- \textit{thread} che tratteremo al cap.~\ref{cha:threads}, è in parte minore,
- ma \func{fork} resta comunque la funzione principale per la creazione di
- processi.} Il prototipo della funzione è:
+ \textit{thread}\unavref{ che tratteremo al cap.~\ref{cha:threads}}, è in
+ parte minore, ma \func{fork} resta comunque la funzione principale per la
+ creazione di processi.} Il prototipo di \funcd{fork} è:
\begin{funcproto}{
\fhead{unistd.h}
\fdecl{pid\_t fork(void)}
\fdesc{Crea un nuovo processo.}
}
-{La funzione ritorna il \ids{PID} del figlio al padre e $0$ al figlio in caso
- di successo e $-1$ al padre senza creare il figlio per un errore,
- nel qual caso \var{errno} assumerà uno dei valori:
+
+{La funzione ritorna in caso di successo il \ids{PID} del figlio nel padre e
+ $0$ nel figlio mentre ritorna $-1$ nel padre, senza creare il figlio, per un
+ errore, al caso \var{errno} assumerà uno dei valori:
\begin{errlist}
\item[\errcode{EAGAIN}] non ci sono risorse sufficienti per creare un altro
processo (per allocare la tabella delle pagine e le strutture del task) o
\end{funcproto}
Dopo il successo dell'esecuzione di una \func{fork} sia il processo padre che
-il processo figlio continuano ad essere eseguiti normalmente a partire
+il processo figlio continuano ad essere eseguiti normalmente, a partire
dall'istruzione successiva alla \func{fork}. Il processo figlio è una copia
del padre, e riceve una copia dei segmenti di testo, dati e dello
\textit{stack} (vedi sez.~\ref{sec:proc_mem_layout}), ed esegue esattamente lo
due volte, una nel padre e una nel figlio.
La scelta di questi valori di ritorno non è casuale, un processo infatti può
-avere più figli, ed il valore di ritorno di \func{fork} è l'unico modo che gli
-permette di identificare quello appena creato. Al contrario un figlio ha
-sempre un solo padre, il cui \ids{PID} può sempre essere ottenuto con
-\func{getppid}, come spiegato in sez.~\ref{sec:proc_pid}, per cui si usa il
-valore nullo, che non è il \ids{PID} di nessun processo.
+avere più figli, ed il valore di ritorno di \func{fork} è l'unico che gli
+permette di identificare qual è quello appena creato. Al contrario un figlio
+ha sempre un solo padre il cui \ids{PID}, come spiegato in
+sez.~\ref{sec:proc_pid}, può sempre essere ottenuto con \func{getppid}; per
+questo si ritorna un valore nullo, che non è il \ids{PID} di nessun processo.
Normalmente la chiamata a \func{fork} può fallire solo per due ragioni: o ci
sono già troppi processi nel sistema, il che di solito è sintomo che
\textit{client-server} è illustrato in sez.~\ref{sec:net_cliserv}) in cui il
padre riceve ed accetta le richieste da parte dei programmi client, per
ciascuna delle quali pone in esecuzione un figlio che è incaricato di fornire
-il servizio.
+le risposte associate al servizio.
La seconda modalità è quella in cui il processo vuole eseguire un altro
programma; questo è ad esempio il caso della shell. In questo caso il processo
\func{sleep}) per il padre ed il figlio (con \cmd{forktest -h} si ottiene la
descrizione delle opzioni). Il codice completo, compresa la parte che gestisce
le opzioni a riga di comando, è disponibile nel file \file{fork\_test.c},
-distribuito insieme agli altri sorgenti degli esempi su
-\url{http://gapil.truelite.it/gapil_source.tgz}.
+distribuito insieme agli altri sorgenti degli esempi della guida su
+\url{http://gapil.gnulinux.it}.
Decifrato il numero di figli da creare, il ciclo principale del programma
(\texttt{\small 24-40}) esegue in successione la creazione dei processi figli
risultati precedenti infatti sono stati ottenuti usando un kernel della
serie 2.4.} Questa è una ottimizzazione adottata per evitare che il padre,
effettuando per primo una operazione di scrittura in memoria, attivasse il
-meccanismo del \textit{copy on write}, operazione inutile qualora il figlio
-venga creato solo per eseguire una \func{exec} su altro programma che scarta
-completamente lo spazio degli indirizzi e rende superflua la copia della
-memoria modificata dal padre. Eseguendo sempre per primo il figlio la
-\func{exec} verrebbe effettuata subito, con la certezza di utilizzare
+meccanismo del \textit{copy on write}, operazione inutile quando il figlio
+viene creato solo per eseguire una \func{exec} per lanciare un altro programma
+che scarta completamente lo spazio degli indirizzi e rende superflua la copia
+della memoria modificata dal padre. Eseguendo sempre per primo il figlio la
+\func{exec} verrebbe effettuata subito, con la certezza di utilizzare il
\textit{copy on write} solo quando necessario.
Con il kernel 2.6.32 però il comportamento è stato nuovamente cambiato,
stavolta facendo eseguire per primo sempre il padre. Si è realizzato infatti
-che l'eventualità prospettata per la scelta precedente era comunque molto
-improbabile, mentre l'esecuzione immediata del padre presenta sempre il
+che l'eventualità prospettata per la scelta precedente era comunque poco
+probabile, mentre l'esecuzione immediata del padre presenta sempre il
vantaggio di poter utilizzare immediatamente tutti i dati che sono nella cache
-della CPU e nella unità di gestione della memoria virtuale senza doverli
+della CPU e nell'unità di gestione della memoria virtuale, senza doverli
invalidare, cosa che per i processori moderni, che hanno linee di cache
interne molto profonde, avrebbe un forte impatto sulle prestazioni.
Allora anche se quanto detto in precedenza vale come comportamento effettivo
dei programmi soltanto per i kernel fino alla serie 2.4, per mantenere la
portabilità con altri kernel unix-like, e con i diversi comportamenti adottati
-dalle Linux nelle versioni successive, è opportuno non fare affidamento su
-nessun tipo comportamento predefinito e non dare per assunta l'esecuzione
-preventiva del padre o del figlio.
-
-Si noti poi come dopo la \func{fork}, essendo i segmenti di memoria utilizzati
-dai singoli processi completamente indipendenti, le modifiche delle variabili
-nei processi figli, come l'incremento di \var{i} in (\texttt{\small 31}), sono
-visibili solo a loro, (ogni processo vede solo la propria copia della
-memoria), e non hanno alcun effetto sul valore che le stesse variabili hanno
-nel processo padre ed in eventuali altri processi figli che eseguano lo stesso
-codice.
+dalle Linux nella sua evoluzione, è comunque opportuno non fare affidamento su
+nessun tipo di comportamento predefinito e non fare assunzioni sull'ordine di
+esecuzione di padre e figlio.
+
+Si noti infine come dopo la \func{fork}, essendo i segmenti di memoria
+utilizzati dai singoli processi completamente indipendenti, le modifiche delle
+variabili nei processi figli, come l'incremento di \var{i} in (\texttt{\small
+ 31}), sono visibili solo a loro, (ogni processo vede solo la propria copia
+della memoria), e non hanno alcun effetto sul valore che le stesse variabili
+hanno nel processo padre ed in eventuali altri processi figli che eseguano lo
+stesso codice.
Un secondo aspetto molto importante nella creazione dei processi figli è
quello dell'interazione dei vari processi con i file. Ne parleremo qui anche
Il comportamento delle varie funzioni di interfaccia con i file è analizzato
in gran dettaglio in sez.~\ref{sec:file_unix_interface} per l'interfaccia
nativa Unix ed in sez.~\ref{sec:files_std_interface} per la standardizzazione
-adottata nelle librerie del linguaggio C e valida per qualunque sistema
-operativo.
+adottata nelle librerie del linguaggio C, valida per qualunque sistema
+operativo.
Qui basta accennare che si sono usate le funzioni standard della libreria del
C che prevedono l'output bufferizzato. Il punto è che questa bufferizzazione
(che tratteremo in dettaglio in sez.~\ref{sec:file_buffering}) varia a seconda
che si tratti di un file su disco, in cui il buffer viene scaricato su disco
solo quando necessario, o di un terminale, in cui il buffer viene scaricato ad
-ogni carattere di a capo.
+ogni carattere di ``a capo''.
Nel primo esempio allora avevamo che, essendovi un a capo nella stringa
stampata, ad ogni chiamata a \func{printf} il buffer veniva scaricato, per cui
tutti i figli. La funzione \func{fork} infatti ha la caratteristica di
duplicare nei processi figli tutti i \textit{file descriptor} (vedi
sez.~\ref{sec:file_fd}) dei file aperti nel processo padre (allo stesso modo
-in cui lo fa la funzione \func{dup}, trattata in sez.~\ref{sec:file_dup}), il
-che comporta che padre e figli condividono le stesse voci della \textit{file
- table} (tratteremo in dettaglio questi termini in sez.~\ref{sec:file_fd} e
-sez.~\ref{sec:file_shared_access}) fra cui c'è anche la posizione corrente nel
-file.
-
-In questo modo se un processo scrive su un file aggiornerà la posizione
-corrente sulla \textit{file table}, e tutti gli altri processi, che vedono la
-stessa \textit{file table}, vedranno il nuovo valore. In questo modo si evita,
-in casi come quello appena mostrato in cui diversi processi scrivono sullo
-stesso file, che l'output successivo di un processo vada a sovrapporsi a
-quello dei precedenti: l'output potrà risultare mescolato, ma non ci saranno
-parti perdute per via di una sovrascrittura.
+in cui lo fa la funzione \func{dup}, trattata in sez.~\ref{sec:file_dup}). Ciò
+fa si che padre e figli condividano le stesse voci della \textit{file table}
+(tratteremo in dettaglio questi termini in sez.~\ref{sec:file_fd} e
+sez.~\ref{sec:file_shared_access}) fra le quali c'è anche la posizione
+corrente nel file.
+
+Quando un processo scrive su un file la posizione corrente viene aggiornata
+sulla \textit{file table}, e tutti gli altri processi, che vedono la stessa
+\textit{file table}, vedranno il nuovo valore. In questo modo si evita, in
+casi come quello appena mostrato in cui diversi processi scrivono sullo stesso
+file, che l'output di un processo successivo vada a sovrapporsi a quello dei
+precedenti: l'output potrà risultare mescolato, ma non ci saranno parti
+perdute per via di una sovrascrittura.
Questo tipo di comportamento è essenziale in tutti quei casi in cui il padre
crea un figlio e attende la sua conclusione per proseguire, ed entrambi
$<-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}
suoi vari campi in sez.~\ref{sec:sig_sigaction}, per quanto ci interessa qui
basta dire che al ritorno di \func{waitid} verranno avvalorati i seguenti
campi:
-\begin{basedescript}{\desclabelwidth{2.0cm}}
+\begin{basedescript}{\desclabelwidth{1.8cm}}
\item[\var{si\_pid}] con il \ids{PID} del figlio.
\item[\var{si\_uid}] con l'\textsl{user-ID reale} (vedi
sez.~\ref{sec:proc_perms}) del figlio.
\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
originari per quanto riguarda tutti gli altri controlli di accesso, così che
l'utente non possa inviare segnali al server NFS.
-Le due funzioni di sistema usate per cambiare questi identificatori sono
-\funcd{setfsuid} e \funcd{setfsgid}, ed ovviamente sono specifiche di Linux e
-non devono essere usate se si intendono scrivere programmi portabili; i loro
-prototipi sono:
+Le due funzioni di sistema usate appositamente per cambiare questi
+identificatori sono \funcd{setfsuid} e \funcd{setfsgid} ovviamente sono
+specifiche di Linux e non devono essere usate se si intendono scrivere
+programmi portabili; i loro prototipi sono:
\begin{funcproto}{
\fhead{sys/fsuid.h}
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
la priorità dinamica determinata dal valore di \textit{nice}, che deve essere
impostato con le funzioni viste in precedenza.
-Lo standard POSIX.1b prevede inoltre che l'intervallo dei valori delle
-priorità statiche possa essere ottenuto con le funzioni di sistema
+Lo standard POSIX.1b prevede che l'intervallo dei valori delle priorità
+statiche possa essere ottenuto con le funzioni di sistema
\funcd{sched\_get\_priority\_max} e \funcd{sched\_get\_priority\_min}, i cui
prototipi sono:
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
possibilità di approfittarne mettendoli in esecuzione, ma chiamarla senza
necessità, specie se questo avviene ripetutamente all'interno di un qualche
ciclo, può avere invece un forte impatto negativo per la generazione di
-\itindex{contest~switch} \textit{contest switch} inutili.
+\textit{context switch} inutili.
\subsection{Il controllo dello \textit{scheduler} per i sistemi
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
% codice e dati, stack, brack pointer ecc. vedi
% http://git.kernel.org/linus/f606b77f1a9e362451aca8f81d8f36a3a112139e
+% TODO documentare ARCH_SET_CPUID e ARCH_GET_CPUID, introdotte con il kernel
+% 4.12, vedi https://lwn.net/Articles/721182/
+
\label{sec:prctl_operation}
\end{basedescript}
\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/
%TODO trattare membarrier, introdotta con il kernel 4.3
% vedi http://lwn.net/Articles/369567/ http://lwn.net/Articles/369640/
% http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=5b25b13ab08f616efd566347d809b4ece54570d1
+% vedi anche l'ulteriore opzione "expedited" introdotta con il kernel 4.14
+% (https://lwn.net/Articles/728795/)
\section{Problematiche di programmazione multitasking}
\label{sec:proc_multi_prog}
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: nell'header scheduler system interrupt timer HZ asm Hertz clock
% LocalWords: l'alpha tick fork wait waitpid exit exec image glibc int pgid ps
% LocalWords: sid thread Ingo Molnar ppid getpid getppid sys unistd LD threads
-% LocalWords: void tempnam pathname sibling cap errno EAGAIN ENOMEM
+% LocalWords: void tempnam pathname sibling cap errno EAGAIN ENOMEM context
% LocalWords: stack read only copy write tab client spawn forktest sleep PATH
% LocalWords: source LIBRARY scheduling race condition printf descriptor dup
% LocalWords: close group session tms lock vfork execve BSD stream main abort
% LocalWords: filesystem noexec EPERM suid sgid root nosuid ENOEXEC ENOENT ELF
% LocalWords: ETXTBSY EINVAL ELIBBAD BIG EFAULT EIO ENAMETOOLONG ELOOP ENOTDIR
% LocalWords: ENFILE EMFILE argc execl path execv execle execlp execvp vector
-% LocalWords: list environ NULL umask utime cutime ustime fcntl linker
+% LocalWords: list environ NULL umask utime cutime ustime fcntl linker Posix
% LocalWords: opendir libc interpreter FreeBSD capabilities mandatory access
% LocalWords: control MAC SELinux security modules LSM superuser uid gid saved
% LocalWords: effective euid egid dell' fsuid fsgid getuid geteuid getgid SVr
% 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
% LocalWords: vhangup mknod lease permitted inherited inheritable bounding AND
% LocalWords: capability capget capset header ESRCH undef version obj clear PT
-% LocalWords: pag ssize length proc capgetp preemptive cache runnable contest
+% LocalWords: pag ssize length proc capgetp preemptive cache runnable
% LocalWords: SIGSTOP soft slice nice niceness counter which SC switch side
% LocalWords: getpriority who setpriority RTLinux RTAI Adeos fault FIFO COUNT
% LocalWords: yield Robin setscheduler policy param OTHER priority setparam to
% LocalWords: NEWUTS SETTLS SIGHAND SYSVSEM UNTRACED tls ctid CLEARTID panic
% LocalWords: loader EISDIR SIGTRAP uninterrutible killable EQUAL sizeof XOR
% LocalWords: destset srcset ALLOC num cpus setsize emacs pager getty TID
+% LocalWords: reaper SUBREAPER Library futex
%%% Local Variables:
%%% mode: latex