funzione chiude tutti i file descriptor appartenenti al processo, cosa che
però non comporta il salvataggio dei dati eventualmente presenti nei buffer
degli \textit{stream}, (torneremo sulle due interfacce dei file in
-cap.~\ref{cha:files_std_interface} e
-cap.~\ref{cha:file_unix_interface})). Infine fa sì che ogni figlio del
-processo sia adottato da \cmd{init} (vedi sez.~\ref{sec:proc_termination}),
-manda un segnale \signal{SIGCHLD} al processo padre (vedi
+sez.~\ref{sec:file_unix_interface} e
+sez.~\ref{sec:files_std_interface}). Infine fa sì che ogni figlio del processo
+sia adottato da \cmd{init} (vedi sez.~\ref{sec:proc_termination}), manda un
+segnale \signal{SIGCHLD} al processo padre (vedi
sez.~\ref{sec:sig_job_control}) e ritorna lo stato di uscita specificato
in \param{status} che può essere raccolto usando la funzione \func{wait} (vedi
sez.~\ref{sec:proc_wait}).
ritorno di \code{main}. La prima funzione che si può utilizzare a tal fine è
\funcd{atexit}, il cui prototipo è:
-\begin{funcproto}{ \fhead{stdlib.h} \fdecl{void (*function)(void)}
- \fdesc{Registra la funzione \param{function} per la chiamata all'uscita
- dal programma.} } {La funzione ritorna $0$ in caso di successo e
- $-1$ per un errore, \var{errno} non viene modificata.}
+\begin{funcproto}{
+\fhead{stdlib.h}
+\fdecl{int atexit(void (*function)(void))}
+\fdesc{Registra la funzione \param{function} per la chiamata all'uscita
+ dal programma.}
+}
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, \var{errno}
+ non viene modificata.}
\end{funcproto}
La funzione richiede come argomento \param{function} l'indirizzo di una
\begin{funcproto}{
\fhead{stdlib.h}
-\fdecl{void (*function)(int , void *), void *arg)}
+\fdecl{int on\_exit(void (*function)(int, void *), void *arg))}
\fdesc{Registra la funzione \param{function} per la chiamata all'uscita dal
programma.}
}
\begin{itemize*}
\item se la variabile è posta a $0$ gli errori vengono ignorati;
\item se la variabile è posta a $1$ viene stampato un avviso sullo
- \textit{standard error} (vedi sez.~\ref{sec:file_std_stream});
+ \textit{standard error} (vedi sez.~\ref{sec:file_fd});
\item se la variabile è posta a $2$ viene chiamata la funzione \func{abort}
(vedi sez.~\ref{sec:sig_alarm_abort}), che in genere causa l'immediata
terminazione del programma;
prima volta che cercherà di accedere alla memoria non effettivamente
disponibile.
+
+\index{segmento!dati|(}
+
Le due funzioni seguenti\footnote{le due funzioni sono state definite con BSD
4.3, sono marcate obsolete in SUSv2 e non fanno parte delle librerie
standard del C e mentre sono state esplicitamente rimosse dallo standard
\end{funcproto}
La funzione è un'interfaccia all'omonima \textit{system call} ed imposta
-l'indirizzo finale del \index{segmento!dati} segmento dati di un processo (più
-precisamente dello \itindex{heap} \textit{heap}) all'indirizzo specificato
+l'indirizzo finale del segmento dati di un processo (più precisamente dello
+\itindex{heap} \textit{heap}) all'indirizzo specificato
da \param{addr}. Quest'ultimo deve essere un valore ragionevole, e la
dimensione totale non deve comunque eccedere un eventuale limite (vedi
sez.~\ref{sec:sys_resource_limit}) imposto sulle dimensioni massime del
-\index{segmento!dati} segmento dati del processo.
+segmento dati del processo.
Il valore di ritorno della funzione fa riferimento alla versione fornita dalla
\acr{glibc}, in realtà in Linux la \textit{system call} corrispondente
-restituisce come valore di ritorno il nuovo valore della fine del
-\index{segmento!dati} segmento dati in caso di successo e quello corrente in
-caso di fallimento, è la funzione di interfaccia usata dalla \acr{glibc} che
-fornisce i valori di ritorno appena descritti; se si usano librerie diverse
-questo potrebbe non accadere.
+restituisce come valore di ritorno il nuovo valore della fine del segmento
+dati in caso di successo e quello corrente in caso di fallimento, è la
+funzione di interfaccia usata dalla \acr{glibc} che fornisce i valori di
+ritorno appena descritti; se si usano librerie diverse questo potrebbe non
+accadere.
-Una seconda funzione per la manipolazione diretta delle dimensioni
-\index{segmento!dati} del segmento dati\footnote{in questo caso si tratta
- soltanto di una funzione di libreria, anche se basata sulla stessa
- \textit{system call}.} è \funcd{sbrk}, ed il suo prototipo è:
+Una seconda funzione per la manipolazione diretta delle dimensioni del
+segmento dati\footnote{in questo caso si tratta soltanto di una funzione di
+ libreria, anche se basata sulla stessa \textit{system call}.} è
+\funcd{sbrk}, ed il suo prototipo è:
\begin{funcproto}{
\fhead{unistd.h}
\type{intptr\_t}, ma a seconda della versione delle librerie e del sistema può
essere indicato con una serie di tipi equivalenti come \type{ptrdiff\_t},
\type{ssize\_t}, \ctyp{int}. Se invocata con un valore nullo la funzione
-permette di ottenere l'attuale posizione della fine del \index{segmento!dati}
-segmento dati.
+permette di ottenere l'attuale posizione della fine del segmento dati.
Queste due funzioni sono state deliberatamente escluse dallo standard POSIX.1
dato che per i normali programmi è sempre opportuno usare le funzioni di
per proprio conto un diverso meccanismo di gestione della memoria del segmento
dati.
+\index{segmento!dati|)}
+
\subsection{Il controllo della memoria virtuale}
\label{sec:proc_mem_lock}
\end{itemize*}
Per ottenere informazioni sulle modalità in cui un programma sta usando la
-memoria virtuale è disponibile una apposita funzione, \funcd{mincore}, che
-però non è standardizzata da POSIX e pertanto non è disponibile su tutte le
-versioni di kernel unix-like;\footnote{nel caso di Linux devono essere
- comunque definite le macro \macro{\_BSD\_SOURCE} e \macro{\_SVID\_SOURCE}.}
-il suo prototipo è:
+memoria virtuale è disponibile una apposita funzione di sistema,
+\funcd{mincore}, che però non è standardizzata da POSIX e pertanto non è
+disponibile su tutte le versioni di kernel unix-like;\footnote{nel caso di
+ Linux devono essere comunque definite le macro \macro{\_BSD\_SOURCE} e
+ \macro{\_SVID\_SOURCE}.} il suo prototipo è:
\begin{funcproto}{
\fhead{unistd.h}
però diversi processi bloccano la stessa pagina questa resterà bloccata
fintanto che ci sarà almeno un processo che la blocca.
-Le funzioni per bloccare e sbloccare la \index{paginazione} paginazione di
-singole sezioni di memoria sono rispettivamente \funcd{mlock} e
+Le funzioni di sistema per bloccare e sbloccare la \index{paginazione}
+paginazione di singole sezioni di memoria sono rispettivamente \funcd{mlock} e
\funcd{munlock}; i loro prototipi sono:
-% \begin{functions}
-% \headdecl{sys/mman.h}
-
-% \funcdecl{int mlock(const void *addr, size\_t len)}
-% Blocca la paginazione su un intervallo di memoria.
-
-% \funcdecl{int munlock(const void *addr, size\_t len)}
-% Rimuove il blocco della paginazione su un intervallo di memoria.
-
-% \bodydesc{Entrambe le funzioni ritornano 0 in caso di successo e $-1$ in
-% caso di errore, nel qual caso \var{errno} assumerà uno dei
-% valori:
-% \begin{errlist}
-% \item[\errcode{ENOMEM}] alcuni indirizzi dell'intervallo specificato non
-% corrispondono allo spazio di indirizzi del processo o si è ecceduto
-% il numero massimo consentito di pagine bloccate.
-% \item[\errcode{EINVAL}] \param{len} non è un valore positivo.
-% \item[\errcode{EPERM}] con un kernel successivo al 2.6.9 il processo non è
-% privilegiato e si un limite nullo per \const{RLIMIT\_MEMLOCK}.
-% \end{errlist}
-% e, per \func{mlock}, anche \errval{EPERM} quando il processo non ha i
-% privilegi richiesti per l'operazione.}
-% \end{functions}
\begin{funcproto}{
\fhead{sys/mman.h}
pagine di memoria, pertanto se si ha a cuore la portabilità si deve avere cura
di allinearne correttamente il valore.
-Altre due funzioni, \funcd{mlockall} e \funcd{munlockall}, consentono di
-bloccare genericamente la \index{paginazione} paginazione per l'intero spazio
-di indirizzi di un processo. I prototipi di queste funzioni sono:
+Altre due funzioni di sistema, \funcd{mlockall} e \funcd{munlockall},
+consentono di bloccare genericamente la \index{paginazione} paginazione per
+l'intero spazio di indirizzi di un processo. I prototipi di queste funzioni
+sono:
\begin{funcproto}{
\fhead{sys/mman.h}
Nonostante la scarsa leggibilità del prototipo si tratta semplicemente di
definire una funzione di tipo \code{void abortfn(enum mcheck\_status status)},
che non deve restituire nulla e che deve avere un unico argomento di tipo
-\type{mcheck\_status}. In caso di errore la funzione verrà eseguita ricevendo
+\code{mcheck\_status}. In caso di errore la funzione verrà eseguita ricevendo
un opportuno valore di \param{status} che è un tipo enumerato che può assumere
soltanto i valori di tab.~\ref{tab:mcheck_status_value} che indicano la
tipologia di errore riscontrata.