(che in seguito incontreremo a più riprese), è mostrato in
fig.~\ref{fig:proc_task_struct}.
-\begin{figure}[htb]
- \centering
- \includegraphics[width=14cm]{img/task_struct}
+\begin{figure}[!htb]
+ \centering \includegraphics[width=14cm]{img/task_struct}
\caption{Schema semplificato dell'architettura delle strutture usate dal
kernel nella gestione dei processi.}
\label{fig:proc_task_struct}
\func{getppid}, vedi sez.~\ref{sec:proc_pid}) per cui si usa il valore nullo,
che non è il \acr{pid} di nessun processo.
-\begin{figure}[!htb]
+\begin{figure}[!htbp]
\footnotesize \centering
- \begin{minipage}[c]{15cm}
+ \begin{minipage}[c]{\codesamplewidth}
\includecodesample{listati/ForkTest.c}
\end{minipage}
\normalsize
sez.~\ref{sec:file_memory_map}) che non vengono ereditate dal figlio;
\item l'impostazione con \func{prctl} (vedi sez.~\ref{sec:process_prctl}) che
notifica al figlio la terminazione del padre viene cancellata;
-\item il segnale di terminazione del figlio è sempre \const{SIGCHLD} anche
+\item il segnale di terminazione del figlio è sempre \signal{SIGCHLD} anche
qualora nel padre fosse stato modificato (vedi sez.~\ref{sec:process_clone}).
\end{itemize*}
chiamare la funzione \func{abort} per invocare una chiusura anomala, o essere
terminato da un segnale (torneremo sui segnali in cap.~\ref{cha:signals}). In
realtà anche la prima modalità si riconduce alla seconda, dato che
-\func{abort} si limita a generare il segnale \const{SIGABRT}.
+\func{abort} si limita a generare il segnale \signal{SIGABRT}.
Qualunque sia la modalità di conclusione di un processo, il kernel esegue
comunque una serie di operazioni: chiude tutti i file aperti, rilascia la
\item viene memorizzato lo stato di terminazione del processo;
\item ad ogni processo figlio viene assegnato un nuovo padre (in genere
\cmd{init});
-\item viene inviato il segnale \const{SIGCHLD} al processo padre (vedi
+\item viene inviato il segnale \signal{SIGCHLD} al processo padre (vedi
sez.~\ref{sec:sig_sigchld});
\item se il processo è un leader di sessione ed il suo terminale di controllo
- è quello della sessione viene mandato un segnale di \const{SIGHUP} a tutti i
+ è quello della sessione viene mandato un segnale di \signal{SIGHUP} a tutti i
processi del gruppo di \textit{foreground} e il terminale di controllo viene
disconnesso (vedi sez.~\ref{sec:sess_ctrl_term});
\item se la conclusione di un processo rende orfano un \textit{process
group} ciascun membro del gruppo viene bloccato, e poi gli vengono
- inviati in successione i segnali \const{SIGHUP} e \const{SIGCONT}
+ inviati in successione i segnali \signal{SIGHUP} e \signal{SIGCONT}
(vedi ancora sez.~\ref{sec:sess_ctrl_term}).
\end{itemize*}
\const{WCONTINUED}& Ritorna anche quando un processo figlio che era stato
fermato ha ripreso l'esecuzione.\footnotemark \\
\hline
- \const{\_\_WCLONE}& Attende solo per i figli creati con \func{clone},
- vale a dire processi che non emettono nessun segnale
- o emettono un segnale diverso da \const{SIGCHL} alla
+ \const{\_\_WCLONE}& Attende solo per i figli creati con \func{clone}
+ (vedi sez.~\ref{sec:process_clone}), vale a dire
+ processi che non emettono nessun segnale
+ o emettono un segnale diverso da \signal{SIGCHLD} alla
terminazione. \\
\const{\_\_WALL} & Attende per qualunque processo figlio. \\
\const{\_\_WNOTHREAD}& Non attende per i figli di altri \textit{thread}
sez.~\ref{sec:process_ptrace}).} (vedi tab.~\ref{tab:proc_proc_states}),
mentre con \const{WCONTINUED} la funzione ritorna quando un processo in stato
\textit{stopped} riprende l'esecuzione per la ricezione del segnale
-\const{SIGCONT} (l'uso di questi segnali per il controllo di sessione è
+\signal{SIGCONT} (l'uso di questi segnali per il controllo di sessione è
dettagliato in sez.~\ref{sec:sess_ctrl_term}).
La terminazione di un processo figlio (così come gli altri eventi osservabili
di un programma e può avvenire in un qualunque momento. Per questo motivo,
come accennato nella sezione precedente, una delle azioni prese dal kernel
alla conclusione di un processo è quella di mandare un segnale di
-\const{SIGCHLD} al padre. L'azione predefinita (si veda
+\signal{SIGCHLD} al padre. L'azione predefinita (si veda
sez.~\ref{sec:sig_base}) per questo segnale è di essere ignorato, ma la sua
generazione costituisce il meccanismo di comunicazione asincrona con cui il
kernel avverte il processo padre che uno dei suoi figli è terminato.
al kernel 2.6, quest'ultimo infatti si è adeguato alle prescrizioni dello
standard POSIX.1-2001,\footnote{una revisione del 2001 dello standard POSIX.1
che ha aggiunto dei requisiti e delle nuove funzioni, come \func{waitid}.}
-e come da esso richiesto se \const{SIGCHLD} viene ignorato, o se si imposta il
+e come da esso richiesto se \signal{SIGCHLD} viene ignorato, o se si imposta il
flag di \const{SA\_NOCLDSTOP} nella ricezione dello stesso (si veda
sez.~\ref{sec:sig_sigaction}) i processi figli che terminano non diventano
\textit{zombie} e sia \func{wait} che \func{waitpid} si bloccano fintanto che
errore di \errcode{ENOCHLD}.\footnote{questo è anche il motivo per cui le
opzioni \const{WUNTRACED} e \const{WCONTINUED} sono utilizzabili soltanto
qualora non si sia impostato il flag di \const{SA\_NOCLDSTOP} per il segnale
- \const{SIGCHLD}.}
+ \signal{SIGCHLD}.}
Con i kernel della serie 2.4 e tutti i kernel delle serie precedenti entrambe
le funzioni di attesa ignorano questa prescrizione\footnote{lo standard POSIX.1
originale infatti lascia indefinito il comportamento di queste funzioni
- quando \const{SIGCHLD} viene ignorato.} e si comportano sempre nello stesso
-modo, indipendentemente dal fatto \const{SIGCHLD} sia ignorato o meno:
+ quando \signal{SIGCHLD} viene ignorato.} e si comportano sempre nello stesso
+modo, indipendentemente dal fatto \signal{SIGCHLD} sia ignorato o meno:
attendono la terminazione di un processo figlio e ritornano il relativo
\acr{pid} e lo stato di terminazione nell'argomento \param{status}.
nullo. \\
\macro{WIFCONTINUED(s)}& Vera se il processo che ha causato il ritorno è
stato riavviato da un
- \const{SIGCONT}.\footnotemark \\
+ \signal{SIGCONT}.\footnotemark \\
\hline
\end{tabular}
\caption{Descrizione delle varie macro di preprocessore utilizzabili per
Per questo la modalità più comune di chiamare queste funzioni è quella di
utilizzarle all'interno di un \textit{signal handler} (vedremo un esempio di
-come gestire \const{SIGCHLD} con i segnali in sez.~\ref{sec:sig_example}). In
+come gestire \signal{SIGCHLD} con i segnali in sez.~\ref{sec:sig_example}). In
questo caso infatti, dato che il segnale è generato dalla terminazione di un
figlio, avremo la certezza che la chiamata a \func{waitpid} non si bloccherà.
\item[\var{si\_pid}] con il \acr{pid} del figlio.
\item[\var{si\_uid}] con l'user-ID reale (vedi sez.~\ref{sec:proc_perms}) del
figlio.
-\item[\var{si\_signo}] con \const{SIGCHLD}.
+\item[\var{si\_signo}] con \signal{SIGCHLD}.
\item[\var{si\_status}] con lo stato di uscita del figlio o con il segnale che
lo ha terminato, fermato o riavviato.
\item[\var{si\_code}] con uno fra \const{CLD\_EXITED}, \const{CLD\_KILLED},
indicato dall'argomento \param{path}, che viene interpretato come il
\itindex{pathname} \textit{pathname} del programma.
-\begin{figure}[htb]
- \centering
- \includegraphics[width=12cm]{img/exec_rel}
+\begin{figure}[!htb]
+ \centering \includegraphics[width=12cm]{img/exec_rel}
\caption{La interrelazione fra le sei funzioni della famiglia \func{exec}.}
\label{fig:proc_exec_relat}
\end{figure}
mantengono la stessa impostazione pure nel nuovo programma, ma tutti gli altri
segnali, ed in particolare quelli per i quali è stato installato un gestore
vengono impostati alla loro azione predefinita (vedi
-sez.~\ref{sec:sig_gen_beha}). Un caso speciale è il segnale \const{SIGCHLD}
+sez.~\ref{sec:sig_gen_beha}). Un caso speciale è il segnale \signal{SIGCHLD}
che, quando impostato a \const{SIG\_IGN}, potrebbe anche essere reimpostato a
\const{SIG\_DFL}, anche se questo con Linux non avviene.\footnote{lo standard
POSIX.1-2001 prevede che questo comportamento sia deciso dalla singola
sez.~\ref{sec:process_prctl}) viene cancellato;
\item il nome del processo viene impostato al nome del file contenente il
programma messo in esecuzione;
-\item il segnale di terminazione viene reimpostato a \const{SIGCHLD};
+\item il segnale di terminazione viene reimpostato a \signal{SIGCHLD};
\item l'ambiente viene reinizializzato impostando le variabili attinenti alla
localizzazione al valore di default POSIX.
\end{itemize*}
genere per I/O), e non può essere
interrotto in nessuna circostanza.\\
\textbf{Stopped} & \texttt{T} & Il processo è stato fermato con un
- \const{SIGSTOP}, o è tracciato.\\
+ \signal{SIGSTOP}, o è tracciato.\\
\textbf{Zombie}\index{zombie} & \texttt{Z} & Il processo è terminato ma il
suo stato di terminazione non è ancora
stato letto dal padre.\\
2.6.25, sostanzialmente identico
all'\textbf{Uninterrutible Sleep} con la
sola differenza che il processo può
- terminato con \const{SIGKILL} (usato per
+ terminato con \signal{SIGKILL} (usato per
lo più per NFS).\\
\hline
\end{tabular}
debba essere assegnato all'interno di un intervallo fra un massimo ed un
minimo che nel caso di Linux sono rispettivamente 1 e 99.
-\begin{figure}[!bht]
+\begin{figure}[!htbp]
\footnotesize \centering
- \begin{minipage}[c]{15cm}
+ \begin{minipage}[c]{\textwidth}
\includestruct{listati/sched_param.c}
\end{minipage}
\normalsize
di processore.
Per facilitare l'uso dell'argomento \param{cpuset} le \acr{glibc} hanno
-introdotto un apposito dato di tipo, \ctyp{cpu\_set\_t},\footnote{questa è una
+introdotto un apposito dato di tipo, \type{cpu\_set\_t},\footnote{questa è una
estensione specifica delle \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
utilizzo non avrà alcun effetto.} Dato che non esiste una interfaccia
diretta nelle \acr{glibc} per queste due funzioni occorrerà invocarle tramite
la funzione \func{syscall} (come illustrato in
-sez.~\ref{sec:intro_syscall}). Le due funzioni sono \funcd{ioprio\_get} ed
+sez.~\ref{sec:proc_syscall}). Le due funzioni sono \funcd{ioprio\_get} ed
\funcd{ioprio\_set}; i rispettivi prototipi sono:
\begin{functions}
\headdecl{linux/ioprio.h}
l'introduzione del supporto del kernel per i \textit{thread} (vedi
cap.~\ref{cha:threads}), si è avuta la necessità di una interfaccia che
consentisse un maggiore controllo sulla modalità con cui vengono creati nuovi
-processi, che poi è stata utilizzata anche per fornire ulteriore supporto per
-le tecnologie di virtualizzazione dei processi (i cosidetti
-\textit{container}).
+processi, che poi è stata utilizzata anche per fornire supporto per le
+tecnologie di virtualizzazione dei processi (i cosiddetti \textit{container}).
Per questo l'interfaccia per la creazione di un nuovo processo è stata
-delegata ad una nuova \textit{system call}, \texttt{sys\_clone}, che consente
-di reimplementare anche la tradizionale \func{fork}. In realtà in questo caso
-più che di nuovi processi si può parlare della creazioni di nuovi
+delegata ad una nuova \textit{system call}, \func{sys\_clone}, che consente di
+reimplementare anche la tradizionale \func{fork}. In realtà in questo caso più
+che di nuovi processi si può parlare della creazioni di nuovi
``\textit{task}'' del kernel che possono assumere la veste sia di un processo
-vero e proprio come quelli trattati finora, che di un \textit{thread}, come
-quelli che vedremo in sez.~\ref{sec:linux_thread}, in cui la memoria viene
-condivisa fra il processo chiamante ed il nuovo processo creato. Per evitare
-confusione fra \textit{thread} e processi ordinari, abbiamo deciso di usare la
+classico come quelli trattati finora, che di un \textit{thread}, come quelli
+che vedremo in sez.~\ref{sec:linux_thread}, in cui la memoria viene condivisa
+fra il processo chiamante ed il nuovo processo creato. Per evitare confusione
+fra \textit{thread} e processi ordinari, abbiamo deciso di usare la
nomenclatura \textit{task} per indicare la unità di esecuzione generica messa
a disposizione del kernel che \texttt{sys\_clone} permette di creare.
+Oltre a questo la funzione consente, ad uso delle nuove funzionalità di
+virtualizzazione dei processi, di creare nuovi \textit{namespace} per una
+serie di proprietà generali dei processi (come l'elenco dei PID, l'albero dei
+file, dei \textit{mount point}, della rete, ecc.), che consentono di creare
+gruppi di processi che vivono in una sorta di spazio separato dagli altri, che
+costituisce poi quello che viene chiamato un \textit{container}.
+
La \textit{system call} richiede soltanto due argomenti: il
primo, \param{flags}, consente di controllare le modalità di creazione del
nuovo \textit{task}, il secondo, \param{child\_stack}, imposta l'indirizzo
dello \itindex{stack} \textit{stack} per il nuovo \textit{task}, e deve essere
indicato quando si intende creare un \textit{thread}. L'esecuzione del
-programma creato da \param{child\_stack} riprende, come per \func{fork}, da
+programma creato da \func{sys\_clone} riprende, come per \func{fork}, da
dopo l'esecuzione della stessa.
La necessità di avere uno \itindex{stack} \textit{stack} alternativo c'è solo
quando si intende creare un \textit{thread}, in tal caso infatti il nuovo
\textit{task} vede esattamente la stessa memoria del \textit{task}
``\textsl{padre}'',\footnote{in questo caso per padre si intende semplicemente
- il \textit{task} che ha eseguito \texttt{sys\_clone} rispetto al
- \textit{task} da essa creato, senza nessuna delle implicazioni che il
- concetto ha per i processi.} e nella sua esecuzione alla prima chiamata di
-una funzione andrebbe a scrivere sullo \textit{stack} usato anche dal padre
-(si ricordi quanto visto in sez.~\ref{sec:proc_mem_layout} riguardo all'uso
-dello \textit{stack}).
+ il \textit{task} che ha eseguito \func{sys\_clone} rispetto al \textit{task}
+ da essa creato, senza nessuna delle implicazioni che il concetto ha per i
+ processi.} e nella sua esecuzione alla prima chiamata di una funzione
+andrebbe a scrivere sullo \textit{stack} usato anche dal padre (si ricordi
+quanto visto in sez.~\ref{sec:proc_mem_layout} riguardo all'uso dello
+\textit{stack}).
Per evitare di doversi garantire contro la evidente possibilità di
-\itindex{race~condition} \textit{race conditions} che questa situazione
-comporta è necessario che il chiamante allochi preventivamente un'area di
-memoria (in genere lo si fa con una \func{malloc}) che la funzione imposterà
-come \textit{stack} del nuovo processo, avendo ovviamente cura di non
-utilizzarla direttamente. In questo modo i due \textit{task} avranno degli
-\textit{stack} indipendenti e non si dovranno affrontare problematiche di
-\itindex{race~condition} \textit{race conditions}. Si tenga presente inoltre
-che in molte architetture lo \textit{stack} cresce verso il basso, pertanto in
-tal caso non si dovrà specificare per \param{child\_stack} il puntatore
-restituito da \func{malloc}, ma un puntatore alla fine del buffer con essa
-allocato.
+\itindex{race~condition} \textit{race condition} che questa situazione
+comporta (vedi sez.~\ref{sec:proc_race_cond} per una spiegazione della
+problematica) è necessario che il chiamante allochi preventivamente un'area di
+memoria. In genere lo si fa con una \func{malloc} che allochi un buffer che
+la funzione imposterà come \textit{stack} del nuovo processo, avendo
+ovviamente cura di non utilizzarlo direttamente nel processo chiamante. In
+questo modo i due \textit{task} avranno degli \textit{stack} indipendenti e
+non si dovranno affrontare problematiche di \itindex{race~condition}
+\textit{race condition}. Si tenga presente inoltre che in molte architetture
+di processore lo \textit{stack} cresce verso il basso, pertanto in tal caso
+non si dovrà specificare per \param{child\_stack} il puntatore restituito da
+\func{malloc}, ma un puntatore alla fine del buffer da essa allocato.
Dato che tutto ciò è necessario solo per i \textit{thread} che condividono la
memoria, la \textit{system call}, a differenza della funzione di libreria che
\val{NULL}, che non imposta un nuovo \textit{stack}. Se infatti si crea un
processo, questo ottiene un suo nuovo spazio degli indirizzi,\footnote{è
sottinteso cioè che non si stia usando il flag \const{CLONE\_VM}.} ed in
-questo caso si applica la semantica del \itindex{copy-on-write} \textit{copy
+questo caso si applica la semantica del \itindex{copy~on~write} \textit{copy
on write} illustrata in sez.~\ref{sec:proc_fork}, per cui le pagine dello
\textit{stack} verranno automaticamente copiate come le altre e il nuovo
processo avrà un suo \textit{stack} totalmente indipendente da quello del
Dato che l'uso principale della nuova \textit{system call} è quello relativo
alla creazione dei \textit{thread}, le \acr{glibc} definiscono una funzione di
-libreria
+libreria con una sintassi diversa, orientata a questo scopo, e la
+\textit{system call} resta accessibile solo se invocata esplicitamente come
+visto in sez.~\ref{sec:proc_syscall}.\footnote{ed inoltre per questa
+ \textit{system call} non è disponibile la chiamata veloce con
+ \texttt{vsyscall}.} La funzione di libreria si chiama semplicemente
+\funcd{clone} ed il suo prototipo è:
+\begin{functions}
+ \headdecl{sys/sched.h}
+
+ \funcdecl{int clone(int (*fn)(void *), void *child\_stack, int
+ flags, void *arg, ... \\
+ /* pid\_t *ptid, struct user\_desc *tls, pid\_t *ctid */)}
+
+ Crea un nuovo processo o \textit{thread} eseguendo la funzione \param{fn}.
+
+ \bodydesc{La funzione ritorna al chiamante il \textit{Thread ID} assegnato
+ al nuovo processo in caso di successo e $-1$ in caso di errore, nel qual
+ caso \var{errno} può assumere i valori:
+ \begin{errlist}
+ \item[\errcode{EAGAIN}] sono già in esecuzione troppi processi.
+ \item[\errcode{EINVAL}] si è usata una combinazione non valida di flag o
+ un valore nullo per \param{child\_stack}.
+ \item[\errcode{ENOMEM}] non c'è memoria sufficiente per creare una nuova
+ \struct{task\_struct} o per copiare le parti del contesto del chiamante
+ necessarie al nuovo \textit{task}.
+ \item[\errcode{EPERM}] non si hanno i privilegi di amministratore
+ richiesti dai flag indicati.
+ \end{errlist}
+ }
+\end{functions}
+
+La funzione prende come primo argomento il puntatore alla funzione che verrà
+messa in esecuzione nel nuovo processo, che può avere un unico argomento di
+tipo puntatore a \ctyp{void}, il cui valore viene passato dal terzo
+argomento \param{arg}; per quanto il precedente prototipo possa intimidire
+nella sua espressione, in realtà l'uso è molto semplice basterà definire una
+qualunque funzione \param{fn} del tipo indicato, e \code{fn(arg)} sarà
+eseguita in un nuovo processo.
-\funcd{clone}
+Il nuovo processo resterà in esecuzione fintanto che la funzione \param{fn}
+non ritorna, o esegue \func{exit} o viene terminata da un segnale. Il valore
+di ritorno della funzione (o quello specificato con \func{exit}) verrà
+utilizzato come stato di uscita della funzione.
+
+I tre argomenti \param{ptid}, \param{tls} e \param{ctid} sono opzionali e sono
+presenti solo a partire dal kernel 2.6.
+
+Il comportamento di \func{clone}, che si riflette sulle caratteristiche del
+nuovo processo da essa creato, è controllato dall'argomento \param{flags},
+
+\begin{basedescript}{\desclabelstyle{\pushlabel}}
+
+\item[\const{CLONE\_CHILD\_CLEARTID}]
+\item[\const{CLONE\_CHILD\_SETTID}]
+\item[\const{CLONE\_FILES}]
+\item[\const{CLONE\_FS}]
+\item[\const{CLONE\_IO}]
+\item[\const{CLONE\_NEWIPC}]
+\item[\const{CLONE\_NEWNET}]
+\item[\const{CLONE\_NEWNS}]
+\item[\const{CLONE\_NEWPID}]
+\item[\const{CLONE\_NEWUTS}]
+\item[\const{CLONE\_PARENT}]
+\item[\const{CLONE\_PARENT\_SETTID}]
+\item[\const{CLONE\_PID}]
+\item[\const{CLONE\_PTRACE}]
+\item[\const{CLONE\_SETTLS}]
+\item[\const{CLONE\_SIGHAND}]
+\item[\const{CLONE\_STOPPED}]
+\item[\const{CLONE\_SYSVSEM}]
+\item[\const{CLONE\_THREAD}]
+\item[\const{CLONE\_UNTRACED}]
+\item[\const{CLONE\_VFORK}]
+\item[\const{CLONE\_VM}]
+\end{basedescript}
\subsection{La funzione \func{prctl}}
PowerPC.
\item[\const{PR\_GET\_ENDIAN}] Ottiene il valore della \textit{endianess} del
processo chiamante, salvato sulla variabile puntata da \param{arg2} che deve
- essere passata come di tipo \type{(int *)}. Introdotta a partire dal kernel
+ 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
della virgola mobile su architettura ia64, secondo il valore
di \param{arg2}, si deve passare \const{PR\_FPEMU\_NOPRINT} per emulare in
maniera trasparente l'accesso alle operazioni in virgola mobile, o
\const{PR\_FPEMU\_SIGFPE} per non emularle ed inviare il segnale
- \const{SIGFPE} (vedi sez.~\ref{sec:sig_prog_error}). Introdotta a partire
+ \signal{SIGFPE} (vedi sez.~\ref{sec:sig_prog_error}). Introdotta a partire
dal kernel 2.4.18, solo su ia64.
\item[\const{PR\_GET\_FPEMU}] Ottiene il valore dei flag di controllo
dell'emulazione della virgola mobile, salvato all'indirizzo puntato
\item[\const{PR\_SET\_PDEATHSIG}] Consente di richiedere l'emissione di un
segnale, che sarà ricevuto dal processo chiamante, in occorrenza della
terminazione del proprio processo padre; in sostanza consente di invertire
- il ruolo di \const{SIGCHLD}. Il valore di \param{arg2} deve indicare il
+ il ruolo di \signal{SIGCHLD}. Il valore di \param{arg2} deve indicare il
numero del segnale, o 0 per disabilitare l'emissione. Il valore viene
automaticamente cancellato per un processo figlio creato con \func{fork}.
Introdotta a partire dal kernel 2.1.57.
\textit{timestamp} (TSC, o \textit{Time Stamp Counter}) da indicare con il
valore di \param{arg2}. Si deve specificare \const{PR\_TSC\_ENABLE} per
abilitare la lettura o \const{PR\_TSC\_SIGSEGV} per disabilitarla con la
- generazione di un segnale di \const{SIGSEGV} (vedi
+ 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}. Introdotta a
partire dal kernel 2.6.26, solo su x86.
illegali, da indicare con il valore di \param{arg2}. Si deve specificare il
valore \const{PR\_UNALIGN\_NOPRINT} per ignorare gli accessi non allineati,
ed il valore \const{PR\_UNALIGN\_SIGBUS} per generare un segnale di
- \const{SIGBUS} (vedi sez.~\ref{sec:sig_prog_error}) in caso di accesso non
+ \signal{SIGBUS} (vedi sez.~\ref{sec:sig_prog_error}) in caso di accesso non
allineato. Introdotta con diverse versioni su diverse architetture.
\item[\const{PR\_GET\_UNALIGN}] Ottiene il valore della modalità di controllo
per l'accesso a indirizzi di memoria non allineati, salvato all'indirizzo
piattaforme più avanzate che hanno il supporto hardware per questo tipo di
controlli.} ma devono essere opportunamente riportati ai processi che
usano quella parte di RAM che presenta errori; nel caso specifico questo
- avviene attraverso l'emissione di un segnale di \const{SIGBUS} (vedi
+ avviene attraverso l'emissione di un segnale di \signal{SIGBUS} (vedi
sez.~\ref{sec:sig_prog_error}).\footnote{in particolare viene anche
impostato il valore di \var{si\_code} in \struct{siginfo\_t} a
\const{BUS\_MCEERR\_AO}; per il significato di tutto questo si faccia
due, che corrispondono anche al valore che si trova nell'impostazione
generale di sistema di \texttt{memory\_failure\_early\_kill}, con
\const{PR\_MCE\_KILL\_EARLY} si richiede l'emissione immediata di
- \const{SIGBUS} non appena viene rilevato un errore, mentre con
+ \signal{SIGBUS} non appena viene rilevato un errore, mentre con
\const{PR\_MCE\_KILL\_LATE} il segnale verrà inviato solo quando il processo
tenterà un accesso alla memoria corrotta. Questi due valori corrispondono
rispettivamente ai valori 1 e 0 di
Da fare
+% TODO: trattare PTRACE_SEIZE, aggiunta con il kernel 3.1
+
+
\subsection{L'accesso alle porte di I/O}
\label{sec:process_io_port}
un'altra invocazione non fa altro che allocarne un'altra copia. Una funzione
può non essere rientrante quando opera su memoria che non è nello
\itindex{stack} \textit{stack}. Ad esempio una funzione non è mai rientrante
-se usa una variabile globale o statica.
+se usa una \index{variabili!globali} variabile globale o
+\index{variabili!statiche} statica.
Nel caso invece la funzione operi su un oggetto allocato dinamicamente, la
cosa viene a dipendere da come avvengono le operazioni: se l'oggetto è creato
parte del programmatore.
In genere le funzioni di libreria non sono rientranti, molte di esse ad
-esempio utilizzano variabili statiche, le \acr{glibc} però mettono a
-disposizione due macro di compilatore,\footnote{si ricordi quanto illustrato
- in sez.~\ref{sec:intro_gcc_glibc_std}.} \macro{\_REENTRANT} e
-\macro{\_THREAD\_SAFE}, la cui definizione attiva le versioni rientranti di
-varie funzioni di libreria, che sono identificate aggiungendo il suffisso
-\code{\_r} al nome della versione normale.
+esempio utilizzano \index{variabili!statiche} variabili statiche, le
+\acr{glibc} però mettono a disposizione due macro di compilatore,\footnote{si
+ ricordi quanto illustrato in sez.~\ref{sec:intro_gcc_glibc_std}.}
+\macro{\_REENTRANT} e \macro{\_THREAD\_SAFE}, la cui definizione attiva le
+versioni rientranti di varie funzioni di libreria, che sono identificate
+aggiungendo il suffisso \code{\_r} al nome della versione normale.
\index{funzioni!rientranti|)}
% LocalWords: SIGKILL static RLIMIT preemption PREEMPT VOLUNTARY IDLE RTPRIO
% LocalWords: completely fair compat uniform CFQ queuing elevator dev cfq RT
% LocalWords: documentation block syscall ioprio IPRIO CLASS class best effort
-% LocalWords: refresh semop dnotify MADV DONTFORK prctl WCLONE SIGCHL WALL big
-% LocalWords: WNOTHREAD DUMPABLE KEEPCAPS IRIX CAPBSET endianess endian
-% LocalWords: little PPC PowerPC FPEMU NOPRINT SIGFPE FPEXC point FP SW
+% LocalWords: refresh semop dnotify MADV DONTFORK prctl WCLONE WALL big
+% LocalWords: WNOTHREAD DUMPABLE KEEPCAPS IRIX CAPBSET endianess endian flags
+% LocalWords: little PPC PowerPC FPEMU NOPRINT SIGFPE FPEXC point FP SW malloc
% LocalWords: exception EXC ENABLE OVF overflow UND underflow RES INV DISABLED
-% LocalWords: NONRECOV ASYNC KEEP securebits NAME NUL PDEATHSIG SECCOMP
-% LocalWords: secure computing sigreturn TIMING STATISTICAL TSC MCE
+% LocalWords: NONRECOV ASYNC KEEP securebits NAME NUL PDEATHSIG SECCOMP VM
+% LocalWords: secure computing sigreturn TIMING STATISTICAL TSC MCE conditions
% LocalWords: timestamp Stamp SIGSEGV UNALIGN SIGBUS MCEERR AO failure early
%%% Local Variables: