OPTnote = {},
OPTannote = {}
}
-@Book{glibc,
+@Book{GlibcMan,
author = {Sandra Loosemore, Richard M. Stallman, Roland McGrath, Andrew Oram and Ulrich Drepper},
editor = {Free Software Foundation},
title = {The GNU C Library Reference Manual},
In presenza di dati invece il programma proseguirà l'esecuzione stampando
(\texttt{\small 19--20}) il nome del segnale ottenuto all'interno della
-struttura \const{signalfd\_siginfo} letta in \var{siginf}\footnote{per la
+struttura \struct{signalfd\_siginfo} letta in \var{siginf}\footnote{per la
stampa si è usato il vettore \var{sig\_names} a ciascun elemento del quale
corrisponde il nome del segnale avente il numero corrispondente, la cui
definizione si è omessa dal codice di fig.~\ref{fig:fiforeporter_code_init}
{La funzione ritorna $0$ in caso di successo e $-1$ per un errore,
nel qual caso \var{errno} assumerà uno dei valori:
\begin{errlist}
- \item[\errcode{BUSY}] \param{target} è la \index{directory~di~lavoro}
+ \item[\errcode{EBUSY}] \param{target} è la \index{directory~di~lavoro}
directory di lavoro di qualche processo, o contiene dei file aperti, o un
altro mount point.
\item[\errcode{EAGAIN}] si è chiamata la funzione con \const{MNT\_EXPIRE}
due, si marca il \itindex{mount~point} \textit{mount point} di un filesystem
non occupato come ``\textsl{in scadenza}'', in tal caso \func{umount2} ritorna
con un errore di \errcode{EAGAIN}, mentre in caso di filesystem occupato si
-sarebbe ricevuto \errcode{BUSY}. Una volta marcato, se nel frattempo non
+sarebbe ricevuto \errcode{EBUSY}. Una volta marcato, se nel frattempo non
viene fatto nessun uso del filesystem, ad una successiva chiamata con
\const{MNT\_EXPIRE} questo verrà smontato. Questo flag consente di realizzare
un meccanismo che smonti automaticamente i filesystem che restano inutilizzati
misura di sicurezza introdotta per evitare, per quei filesystem per il quale è
prevista una gestione diretta da parte degli utenti, come quelli basati su
FUSE,\footnote{il \textit{Filesystem in USEr space} (FUSE) è una delle più
- interessanti applicazioni del VFS che consente, tramite un opportuno modulo,
- di implementare le funzioni del \textit{Virtual File System} in user space,
- così da rendere possibile agli utenti l'implementazione di un loro filesytem
- qualunque (con applicazioni di grande interesse come il filesystem cifrato
- \textit{encfs} o il filesystem di rete \textit{sshfs}).} che si possano
-passare ai programmi che effettuano lo smontaggio dei filesystem, che in
-genere sono privilegiati ma consentono di agire solo sui propri \textit{mount
- point}, dei link simbolici che puntano ad altri \textit{mount point},
-ottenendo così la possibilità di smontare qualunque filesystem.
+ interessanti applicazioni del \itindex{Virtual~File~System} VFS che
+ consente, tramite un opportuno modulo, di implementarne le funzioni in
+ \textit{user space}, così da rendere possibile l'implementazione di un
+ qualunque filesytem (con applicazioni di grande interesse come il filesystem
+ cifrato \textit{encfs} o il filesystem di rete \textit{sshfs}) che possa
+ essere usato direttamente per conto degli utenti.} che si possano passare
+ai programmi che effettuano lo smontaggio dei filesystem, che in genere sono
+privilegiati ma consentono di agire solo sui propri \textit{mount point}, dei
+link simbolici che puntano ad altri \textit{mount point}, ottenendo così la
+possibilità di smontare qualunque filesystem.
Altre due funzioni specifiche di Linux,\footnote{esse si trovano anche su BSD,
\end{figure}
Le \acr{glibc} provvedono infine una serie di funzioni per la gestione dei due
-file \conffile{/etc/fstab} ed \conffile{/etc/mtab}, che convenzionalmente sono
-usati in quasi tutti i sistemi unix-like per mantenere rispettivamente le
-informazioni riguardo ai filesystem da montare e a quelli correntemente
-montati. Le funzioni servono a leggere il contenuto di questi file in
-opportune strutture \struct{fstab} e \struct{mntent}, e, nel caso di
-\conffile{/etc/mtab}, per inserire e rimuovere le voci presenti nel file.
+file \conffile{/etc/fstab}\footnote{più precisamente \funcm{setfsent},
+ \funcm{getfsent}, \funcm{getfsfile}, \funcm{getfsspec}, \funcm{endfsent}.}
+ed \conffile{/etc/mtab}\footnote{più precisamente \funcm{setmntent},
+ \funcm{getmntent},\funcm{getmntent\_r}, \funcm{addmntent},\funcm{endmntent},
+ \funcm{hasmntopt}.} che convenzionalmente sono usati in quasi tutti i
+sistemi unix-like per mantenere rispettivamente le informazioni riguardo ai
+filesystem da montare e a quelli correntemente montati. Le funzioni servono a
+leggere il contenuto di questi file in opportune strutture \struct{fstab} e
+\struct{mntent}, e, nel caso di \conffile{/etc/mtab}, per inserire e rimuovere
+le voci presenti nel file.
In generale si dovrebbero usare queste funzioni, in particolare quelle
relative a \conffile{/etc/mtab}, quando si debba scrivere un programma che
aggiornato correttamente (cosa che è impossibile se la radice è montata in
sola lettura) il suo contenuto diventa fuorviante.
-Pe questo motivo il suo utilizzo viene deprecato ed in molti casi viene già
+Per questo motivo il suo utilizzo viene deprecato ed in molti casi viene già
oggi sostituito da un link simbolico a \procfile{/proc/mounts}, che contiene
una versione degli stessi contenuti (vale a dire l'elenco dei filesystem
montati) generata direttamente dal kernel, e quindi sempre disponibile e
sempre aggiornata. Per questo motivo tralasceremo la trattazione, di queste
-funzioni, rimandando al manuale delle \acr{glibc} \cite{glibc} per la
+funzioni, rimandando al manuale delle \acr{glibc} \cite{GlibcMan} per la
documentazione completa.
% TODO (bassa priorità) scrivere delle funzioni (getfsent e getmntent &C)
% TODO (bassa priorità) documentare ? swapon e swapoff (man 2 ...)
+
\section{La gestione di file e directory}
\label{sec:file_dir}
\label{fig:ipc_msqid_ds}
\end{figure}
-A ciascuna coda è associata una struttura \struct{msgid\_ds}, la cui
+A ciascuna coda è associata una struttura \struct{msqid\_ds}, la cui
definizione, è riportata in fig.~\ref{fig:ipc_msqid_ds}. In questa struttura
il kernel mantiene le principali informazioni riguardo lo stato corrente della
coda.\footnote{come accennato questo vale fino ai kernel della serie 2.2.x,
semafori possono restare occupati, abbiamo visto come \func{semop} permetta di
attivare un meccanismo di ripristino attraverso l'uso del flag
\const{SEM\_UNDO}. Il meccanismo è implementato tramite una apposita struttura
-\struct{sem\_undo}, associata ad ogni processo per ciascun semaforo che esso
+\kstruct{sem\_undo}, associata ad ogni processo per ciascun semaforo che esso
ha modificato; all'uscita i semafori modificati vengono ripristinati, e le
strutture disallocate. Per mantenere coerente il comportamento queste
strutture non vengono ereditate attraverso una \func{fork} (altrimenti si
immediatamente, dopo di che il kernel esegue una scansione della coda di
attesa (a partire da \var{sem\_pending}) per verificare se qualcuna delle
operazioni sospese in precedenza può essere eseguita, nel qual caso la
-struttura \struct{sem\_queue} viene rimossa e lo stato del processo associato
+struttura \kstruct{sem\_queue} viene rimossa e lo stato del processo associato
all'operazione (\var{sleeper}) viene riportato a \textit{running}; il tutto
viene ripetuto fin quando non ci sono più operazioni eseguibili o si è
svuotata la coda. Per gestire il meccanismo del ripristino tutte le volte che
un'altra funzione, per cui se l'errore avviene in una funzione, e la sua
gestione ordinaria è in un'altra, occorre usare quello che viene chiamato un
\textsl{salto non-locale}. Il caso classico in cui si ha questa necessità,
-citato sia in \cite{APUE} che in \cite{glibc}, è quello di un programma nel
+citato sia in \cite{APUE} che in \cite{GlibcMan}, è quello di un programma nel
cui corpo principale vengono letti dei dati in ingresso sui quali viene
eseguita, tramite una serie di funzioni di analisi, una scansione dei
contenuti, da cui si ottengono le indicazioni per l'esecuzione di opportune
all'indietro di tutti gli errori rilevabili dalle funzioni usate nelle fasi
successive. Questo comporterebbe una notevole complessità, mentre sarebbe
molto più comodo poter tornare direttamente al ciclo di lettura principale,
-scartando l'input come errato.\footnote{a meno che, come precisa \cite{glibc},
- alla chiusura di ciascuna fase non siano associate operazioni di pulizia
- specifiche (come deallocazioni, chiusure di file, ecc.), che non potrebbero
- essere eseguite con un salto non-locale.}
+scartando l'input come errato.\footnote{a meno che, come precisa
+ \cite{GlibcMan}, alla chiusura di ciascuna fase non siano associate
+ operazioni di pulizia specifiche (come deallocazioni, chiusure di file,
+ ecc.), che non potrebbero essere eseguite con un salto non-locale.}
Tutto ciò può essere realizzato proprio con un salto non-locale; questo di
norma viene realizzato salvando il contesto dello \itindex{stack}
valutato più volte. Questo significa ad esempio che non si può usare al suo
posto una funzione o un'altra macro, altrimenti queste verrebbero eseguite più
volte, l'argomento cioè non deve avere \textsl{effetti collaterali} (in gergo
-\itindex{side!effects} \textit{side effects}).\footnote{nel linguaggio C si
+\itindex{side~effects} \textit{side effects}).\footnote{nel linguaggio C si
parla appunto di \textit{side effects} quando si usano istruzioni la cui
valutazione comporta effetti al di fuori dell'istruzione stessa, come il
caso indicato in cui si passa una funzione ad una macro che usa l'argomento
socket permette di scegliere lo stile di comunicazione indicando il tipo di
socket con l'argomento \param{type} di \func{socket}. Linux mette a
disposizione vari tipi di socket (che corrispondono a quelli che il manuale
-della \acr{glibc} \cite{glibc} chiama \textit{styles}) identificati dalle
+della \acr{glibc} \cite{GlibcMan} chiama \textit{styles}) identificati dalle
seguenti costanti:\footnote{le pagine di manuale POSIX riportano solo i primi
tre tipi, Linux supporta anche gli altri, come si può verificare nel file
\texttt{include/linux/net.h} dei sorgenti del kernel.}
una lettura approfondita del meccanismo descritto nell'RFC~1305, ci limitiamo
a descrivere in tab.~\ref{tab:sys_timex_mode} i principali valori utilizzabili
per il campo \var{mode}, un elenco più dettagliato del significato dei vari
-campi della struttura \struct{timex} può essere ritrovato in \cite{glibc}.
+campi della struttura \struct{timex} può essere ritrovato in \cite{GlibcMan}.
\begin{table}[!htb]
\footnotesize