%% fileunix.tex
%%
-%% Copyright (C) 2000-2005 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2000-2007 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",
Esamineremo in questo capitolo la prima delle due interfacce di programmazione
-per i file, quella dei \textit{file descriptor}\index{file!descriptor},
+per i file, quella dei \index{file!descriptor} \textit{file descriptor},
nativa di Unix. Questa è l'interfaccia di basso livello provvista direttamente
dalle system call, che non prevede funzionalità evolute come la
bufferizzazione o funzioni di lettura o scrittura formattata, e sulla quale è
\index{file!descriptor|(}
-Per poter accedere al contenuto di un file occorre
-creare un canale di comunicazione con il kernel che renda possibile operare su
-di esso (si ricordi quanto visto in sez.~\ref{sec:file_vfs_work}). Questo si
-fa aprendo il file con la funzione \func{open} che provvederà a localizzare
-l'inode\index{inode} del file e inizializzare i puntatori che rendono
-disponibili le funzioni che il VFS mette a disposizione (riportate in
+Per poter accedere al contenuto di un file occorre creare un canale di
+comunicazione con il kernel che renda possibile operare su di esso (si ricordi
+quanto visto in sez.~\ref{sec:file_vfs_work}). Questo si fa aprendo il file
+con la funzione \func{open} che provvederà a localizzare \index{inode} l'inode
+del file e inizializzare i puntatori che rendono disponibili le funzioni che
+il VFS mette a disposizione (riportate in
tab.~\ref{tab:file_file_operations}). Una volta terminate le operazioni, il
file dovrà essere chiuso, e questo chiuderà il canale di comunicazione
impedendo ogni ulteriore operazione.
Per capire come funziona il meccanismo occorre spiegare a grandi linee come il
kernel gestisce l'interazione fra processi e file. Il kernel mantiene sempre
un elenco dei processi attivi nella cosiddetta \itindex{process~table}
-\textit{process table} ed un elenco dei file aperti nella \textit{file table}.
+\textit{process table} ed un elenco dei file aperti nella
+\itindex{file~table} \textit{file table}.
La \itindex{process~table} \textit{process table} è una tabella che contiene
una voce per ciascun processo attivo nel sistema. In Linux ciascuna voce è
\item i flag relativi ai file descriptor.
\item il numero di file aperti.
\item una tabella che contiene un puntatore alla relativa voce nella
- \textit{file table} per ogni file aperto.
+ \itindex{file~table} \textit{file table} per ogni file aperto.
\end{itemize*}
il \textit{file descriptor} in sostanza è l'intero positivo che indicizza
quest'ultima tabella.
-La \textit{file table} è una tabella che contiene una voce per ciascun file
-che è stato aperto nel sistema. In Linux è costituita da strutture di tipo
-\struct{file}; in ciascuna di esse sono tenute varie informazioni relative al
-file, fra cui:
+La \itindex{file~table} \textit{file table} è una tabella che contiene una
+voce per ciascun file che è stato aperto nel sistema. In Linux è costituita da
+strutture di tipo \struct{file}; in ciascuna di esse sono tenute varie
+informazioni relative al file, fra cui:
\begin{itemize*}
\item lo stato del file (nel campo \var{f\_flags}).
\item il valore della posizione corrente (l'\textit{offset}) nel file (nel
campo \var{f\_pos}).
-\item un puntatore all'inode\index{inode}\footnote{nel kernel 2.4.x si è in
- realtà passati ad un puntatore ad una struttura \struct{dentry} che punta a
- sua volta all'inode\index{inode} passando per la nuova struttura del VFS.}
- del file.
+\item un puntatore \index{inode} all'inode\footnote{nel kernel 2.4.x si è in
+ realtà passati ad un puntatore ad una struttura \struct{dentry} che punta
+ a sua volta \index{inode} all'inode passando per la nuova struttura del
+ VFS.} del file.
%\item un puntatore alla tabella delle funzioni \footnote{la struttura
% \var{f\_op} descritta in sez.~\ref{sec:file_vfs_work}} che si possono usare
% sul file.
Ritorneremo su questo schema più volte, dato che esso è fondamentale per
capire i dettagli del funzionamento dell'interfaccia dei \textit{file
descriptor}.
+
\index{file!descriptor|)}
\begin{figure}[htb]
In tutti i sistemi unix-like esiste una convenzione generale per cui ogni
processo viene lanciato dalla shell con almeno tre file aperti. Questi, per
-quanto appena detto, avranno come \textit{file
- descriptor}\index{file!descriptor} i valori 0, 1 e 2. Benché questa sia
-soltanto una convenzione, essa è seguita dalla gran parte delle applicazioni,
-e non aderirvi potrebbe portare a gravi problemi di interoperabilità.
+quanto appena detto, avranno come \index{file!descriptor} \textit{file
+ descriptor} i valori 0, 1 e 2. Benché questa sia soltanto una convenzione,
+essa è seguita dalla gran parte delle applicazioni, e non aderirvi potrebbe
+portare a gravi problemi di interoperabilità.
Il primo file è sempre associato al cosiddetto \textit{standard input}; è cioè
il file da cui il processo si aspetta di ricevere i dati in ingresso. Il
facendo riferimento ad un programma in cui lo \textit{standard input} è
associato ad un file mentre lo \textit{standard output} e lo \textit{standard
error} sono entrambi associati ad un altro file (e quindi utilizzano lo
-stesso inode\index{inode}).
+stesso \index{inode} inode).
Nelle vecchie versioni di Unix (ed anche in Linux fino al kernel 2.0.x) il
numero di file aperti era anche soggetto ad un limite massimo dato dalle
\label{sec:file_open}
La funzione \funcd{open} è la funzione fondamentale per accedere ai file, ed è
-quella che crea l'associazione fra un \itindex{pathname}\textit{pathname} ed
-un file descriptor, il suo prototipo è:
+quella che crea l'associazione fra un \itindex{pathname} \textit{pathname} ed
+un \index{file!descriptor} file descriptor, il suo prototipo è:
\begin{functions}
\headdecl{sys/types.h}
\headdecl{sys/stat.h}
La funzione apre il file usando il primo file descriptor libero, e crea
-l'opportuna voce, cioè la struttura \struct{file}, nella \textit{file table}
-del processo. Viene sempre restituito come valore di ritorno il file
-descriptor con il valore più basso disponibile.
+l'opportuna voce, cioè la struttura \struct{file}, nella \itindex{file~table}
+\textit{file table} del processo. Viene sempre restituito come valore di
+ritorno il file descriptor con il valore più basso disponibile.
\footnotetext[2]{la pagina di manuale di \func{open} segnala che questa
opzione è difettosa su NFS, e che i programmi che la usano per stabilire un
- \textsl{file di lock}\index{file!di lock} possono incorrere in una
- \textit{race condition}\itindex{race~condition}. Si consiglia come
+ \index{file!di lock} \textsl{file di lock} possono incorrere in una
+ \itindex{race~condition} \textit{race condition}. Si consiglia come
alternativa di usare un file con un nome univoco e la funzione \func{link}
per verificarne l'esistenza (vedi sez.~\ref{sec:ipc_file_lock}).}
-\footnotetext[3]{acronimo di \textit{Denial of
- Service}\itindex{Denial~of~Service~(DoS)}, si chiamano così attacchi
- miranti ad impedire un servizio causando una qualche forma di carico
- eccessivo per il sistema, che resta bloccato nelle risposte all'attacco.}
-
\begin{table}[!htb]
\centering
\footnotesize
- \begin{tabular}[c]{|l|p{12cm}|}
+ \begin{tabular}[c]{|l|p{13cm}|}
\hline
\textbf{Flag} & \textbf{Descrizione} \\
\hline
\hline
\const{O\_CREAT} & Se il file non esiste verrà creato, con le regole di
titolarità del file viste in
- sez.~\ref{sec:file_ownership}. Con questa opzione
- l'argomento \param{mode} deve essere specificato. \\
+ sez.~\ref{sec:file_ownership_management}. Con questa
+ opzione l'argomento \param{mode} deve essere
+ specificato. \\
\const{O\_EXCL} & Usato in congiunzione con \const{O\_CREAT} fa sì che
la precedente esistenza del file diventi un
errore\protect\footnotemark\ che fa fallire
\itindex{Denial~of~Service~(DoS)}
\textit{DoS}\protect\footnotemark\ quando
\func{opendir} viene chiamata su una fifo o su un
+ dispositivo associato ad una unità a nastri, non deve
dispositivo a nastri; non deve essere utilizzato
al di fuori dell'implementazione di \func{opendir}. \\
\const{O\_LARGEFILE}&nel caso di sistemi a 32 bit che supportano file di
\label{tab:file_open_flags}
\end{table}
+\footnotetext[3]{acronimo di \itindex{Denial~of~Service~(DoS)} \textit{Denial
+ of Service}, si chiamano così attacchi miranti ad impedire un servizio
+ causando una qualche forma di carico eccessivo per il sistema, che resta
+ bloccato nelle risposte all'attacco.}
+
\footnotetext[4]{il problema è che NFS non supporta la scrittura in
\itindex{append~mode} \textit{append}, ed il kernel deve simularla, ma
questo comporta la possibilità di una \itindex{race~condition} \textit{race
valori possibili sono gli stessi già visti in sez.~\ref{sec:file_perm_overview}
e possono essere specificati come OR binario delle costanti descritte in
tab.~\ref{tab:file_bit_perm}. Questi permessi sono filtrati dal valore di
-\var{umask} (vedi sez.~\ref{sec:file_umask}) per il processo.
+\var{umask} (vedi sez.~\ref{sec:file_perm_management}) per il processo.
La funzione prevede diverse opzioni, che vengono specificate usando vari bit
dell'argomento \param{flags}. Alcuni di questi bit vanno anche a costituire
\index{file!locking} è trattato in sez.~\ref{sec:file_locking}) che il
processo poteva avere acquisito su di esso; se \param{fd} è l'ultimo
riferimento (di eventuali copie) ad un file aperto, tutte le risorse nella
-file table vengono rilasciate. Infine se il file descriptor era l'ultimo
-riferimento ad un file su disco quest'ultimo viene cancellato.
+\itindex{file~table} \textit{file table} vengono rilasciate. Infine se il file
+descriptor era l'ultimo riferimento ad un file su disco quest'ultimo viene
+cancellato.
Si ricordi che quando un processo termina anche tutti i suoi file descriptor
vengono chiusi, molti programmi sfruttano questa caratteristica e non usano
successo e $-1$ in caso di errore nel qual caso \var{errno} assumerà uno
dei valori:
\begin{errlist}
- \item[\errcode{ESPIPE}] \param{fd} è una pipe, un socket\index{socket} o una
- fifo.
+ \item[\errcode{ESPIPE}] \param{fd} è una pipe, un socket o una fifo.
\item[\errcode{EINVAL}] \param{whence} non è un valore valido.
\end{errlist}
ed inoltre \errval{EBADF}.}
la successiva scrittura avvenga alla fine del file, infatti se questo è stato
aperto anche da un altro processo che vi ha scritto, la fine del file può
essersi spostata, ma noi scriveremo alla posizione impostata in precedenza
-(questa è una potenziale sorgente di \itindex{race~condition}\textit{race
+(questa è una potenziale sorgente di \itindex{race~condition} \textit{race
condition}, vedi sez.~\ref{sec:file_atomic}).
Non tutti i file supportano la capacità di eseguire una \func{lseek}, in
di byte richiesti eccede quelli disponibili la funzione ritorna comunque, ma
con un numero di byte inferiore a quelli richiesti.
-Lo stesso comportamento avviene caso di lettura dalla rete (cioè su un
-socket\index{socket}, come vedremo in sez.~\ref{sec:sock_io_behav}), o per la
-lettura da certi file di dispositivo, come le unità a nastro, che
-restituiscono sempre i dati ad un singolo blocco alla volta, o come le linee
-seriali, che restituiscono solo i dati ricevuti fino al momento della lettura.
+Lo stesso comportamento avviene caso di lettura dalla rete (cioè su un socket,
+come vedremo in sez.~\ref{sec:sock_io_behav}), o per la lettura da certi file
+di dispositivo, come le unità a nastro, che restituiscono sempre i dati ad un
+singolo blocco alla volta, o come le linee seriali, che restituiscono solo i
+dati ricevuti fino al momento della lettura.
Infine anche le due condizioni segnalate dagli errori \errcode{EINTR} ed
\errcode{EAGAIN} non sono propriamente degli errori. La prima si verifica
\label{fig:file_mult_acc}
\end{figure}
-Il primo caso è quello in cui due processi diversi aprono lo stesso file
-su disco; sulla base di quanto visto in sez.~\ref{sec:file_fd} avremo una
+Il primo caso è quello in cui due processi diversi aprono lo stesso file su
+disco; sulla base di quanto visto in sez.~\ref{sec:file_fd} avremo una
situazione come quella illustrata in fig.~\ref{fig:file_mult_acc}: ciascun
processo avrà una sua voce nella \textit{file table} referenziata da un
diverso file descriptor nella sua \struct{file\_struct}. Entrambe le voci
-nella \textit{file table} faranno però riferimento allo stesso
-inode\index{inode} su disco.
+nella \itindex{file~table} \textit{file table} faranno però riferimento allo
+stesso \index{inode} inode su disco.
Questo significa che ciascun processo avrà la sua posizione corrente sul file,
la sua modalità di accesso e versioni proprie di tutte le proprietà che
-vengono mantenute nella sua voce della \textit{file table}. Questo ha
-conseguenze specifiche sugli effetti della possibile azione simultanea sullo
-stesso file, in particolare occorre tenere presente che:
+vengono mantenute nella sua voce della \itindex{file~table} \textit{file
+ table}. Questo ha conseguenze specifiche sugli effetti della possibile
+azione simultanea sullo stesso file, in particolare occorre tenere presente
+che:
\begin{itemize}
\item ciascun processo può scrivere indipendentemente; dopo ciascuna
\func{write} la posizione corrente sarà cambiata solo nel processo. Se la
scrittura eccede la dimensione corrente del file questo verrà esteso
- automaticamente con l'aggiornamento del campo \var{i\_size}
- nell'inode\index{inode}.
+ automaticamente con l'aggiornamento del campo \var{i\_size} \index{inode}
+ nell'inode.
\item se un file è in modalità \itindex{append~mode} \const{O\_APPEND} tutte
le volte che viene effettuata una scrittura la posizione corrente viene
- prima impostata alla dimensione corrente del file letta
- dall'inode\index{inode}. Dopo la scrittura il file viene automaticamente
- esteso.
+ prima impostata alla dimensione corrente del file letta \index{inode}
+ dall'inode. Dopo la scrittura il file viene automaticamente esteso.
\item l'effetto di \func{lseek} è solo quello di cambiare il campo
- \var{f\_pos} nella struttura \struct{file} della \textit{file table}, non
- c'è nessuna operazione sul file su disco. Quando la si usa per porsi alla
- fine del file la posizione viene impostata leggendo la dimensione corrente
- dall'inode\index{inode}.
+ \var{f\_pos} nella struttura \struct{file} della \itindex{file~table}
+ \textit{file table}, non c'è nessuna operazione sul file su disco. Quando la
+ si usa per porsi alla fine del file la posizione viene impostata leggendo la
+ dimensione corrente \index{inode} dall'inode.
\end{itemize}
\begin{figure}[htb]
\end{figure}
Il secondo caso è quello in cui due file descriptor di due processi diversi
-puntino alla stessa voce nella \textit{file table}; questo è ad esempio il
-caso dei file aperti che vengono ereditati dal processo figlio all'esecuzione
-di una \func{fork} (si ricordi quanto detto in sez.~\ref{sec:proc_fork}). La
-situazione è illustrata in fig.~\ref{fig:file_acc_child}; dato che il processo
-figlio riceve una copia dello spazio di indirizzi del padre, riceverà anche
-una copia di \struct{file\_struct} e relativa tabella dei file aperti.
+puntino alla stessa voce nella \itindex{file~table} \textit{file table};
+questo è ad esempio il caso dei file aperti che vengono ereditati dal processo
+figlio all'esecuzione di una \func{fork} (si ricordi quanto detto in
+sez.~\ref{sec:proc_fork}). La situazione è illustrata in
+fig.~\ref{fig:file_acc_child}; dato che il processo figlio riceve una copia
+dello spazio di indirizzi del padre, riceverà anche una copia di
+\struct{file\_struct} e relativa tabella dei file aperti.
In questo modo padre e figlio avranno gli stessi file descriptor che faranno
riferimento alla stessa voce nella \textit{file table}, condividendo così la
problema, quando si andrà a scrivere le operazioni potranno mescolarsi in
maniera imprevedibile. Il sistema però fornisce in alcuni casi la possibilità
di eseguire alcune operazioni di scrittura in maniera coordinata anche senza
-utilizzare meccanismi di sincronizzazione più complessi (come il \textit{file
- locking} \index{file!locking}, che esamineremo in
+utilizzare meccanismi di sincronizzazione più complessi (come il
+\index{file!locking} \textit{file locking}, che esamineremo in
sez.~\ref{sec:file_locking}).
Un caso tipico di necessità di accesso condiviso in scrittura è quello in cui
vari processi devono scrivere alla fine di un file (ad esempio un file di
log). Come accennato in sez.~\ref{sec:file_lseek} impostare la posizione alla
-fine del file e poi scrivere può condurre ad una
-\itindex{race~condition}\textit{race condition}: infatti può succedere che un
-secondo processo scriva alla fine del file fra la \func{lseek} e la
-\func{write}; in questo caso, come abbiamo appena visto, il file sarà esteso,
-ma il nostro primo processo avrà ancora la posizione corrente impostata con la
-\func{lseek} che non corrisponde più alla fine del file, e la successiva
-\func{write} sovrascriverà i dati del secondo processo.
+fine del file e poi scrivere può condurre ad una \itindex{race~condition}
+\textit{race condition}: infatti può succedere che un secondo processo scriva
+alla fine del file fra la \func{lseek} e la \func{write}; in questo caso, come
+abbiamo appena visto, il file sarà esteso, ma il nostro primo processo avrà
+ancora la posizione corrente impostata con la \func{lseek} che non corrisponde
+più alla fine del file, e la successiva \func{write} sovrascriverà i dati del
+secondo processo.
Il problema è che usare due system call in successione non è un'operazione
atomica; il problema è stato risolto introducendo la modalità
atomica.
Un altro caso tipico in cui è necessaria l'atomicità è quello in cui si vuole
-creare un \textsl{file di lock}\index{file!di lock}, bloccandosi se il file
+creare un \textsl{file di lock} \index{file!di lock}, bloccandosi se il file
esiste. In questo caso la sequenza logica porterebbe a verificare prima
l'esistenza del file con una \func{stat} per poi crearlo con una \func{creat};
-di nuovo avremmo la possibilità di una \textit{race
- condition}\itindex{race~condition} da parte di un altro processo che crea lo
-stesso file fra il controllo e la creazione.
+di nuovo avremmo la possibilità di una \itindex{race~condition} \textit{race
+ condition} da parte di un altro processo che crea lo stesso file fra il
+controllo e la creazione.
Per questo motivo sono stati introdotti per \func{open} i due flag
\const{O\_CREAT} e \const{O\_EXCL}. In questo modo l'operazione di controllo
file specificato, ed attendono fino alla conclusione delle operazioni;
\func{fsync} forza anche la sincronizzazione dei metadati del file (che
riguardano sia le modifiche alle tabelle di allocazione dei settori, che gli
-altri dati contenuti nell'inode\index{inode} che si leggono con \func{fstat},
+altri dati contenuti \index{inode} nell'inode che si leggono con \func{fstat},
come i tempi del file).
Si tenga presente che questo non comporta la sincronizzazione della
gestione sia delle loro proprietà, che di tutta una serie di ulteriori
funzionalità che il kernel può mettere a disposizione.\footnote{ad esempio si
gestiscono con questa funzione varie modalità di I/O asincrono (vedi
- sez.~\ref{sec:file_asyncronous_operation}) e il file locking
- \index{file!locking} (vedi sez.~\ref{sec:file_locking}).}
+ sez.~\ref{sec:file_asyncronous_operation}) e il \index{file!locking}
+ \textit{file locking} (vedi sez.~\ref{sec:file_locking}).}
Per queste operazioni di manipolazione e di controllo delle varie proprietà e
caratteristiche di un file descriptor, viene usata la funzione \funcd{fcntl},
massimo numero di descrittori consentito.
\item[\const{F\_SETFD}] imposta il valore del \textit{file descriptor flag} al
valore specificato con \param{arg}. Al momento l'unico bit usato è quello di
- \textit{close-on-exec}\itindex{close-on-exec}, identificato dalla costante
+ \itindex{close-on-exec} \textit{close-on-exec}, identificato dalla costante
\const{FD\_CLOEXEC}, che serve a richiedere che il file venga chiuso nella
esecuzione di una \func{exec} (vedi sez.~\ref{sec:proc_exec}). Ritorna un
valore nullo in caso di successo e $-1$ in caso di errore.
dei segnali \const{SIGIO} e \const{SIGURG} per gli eventi associati al file
descriptor \param{fd}. Nel caso di un \textit{process group} viene
restituito un valore negativo il cui valore assoluto corrisponde
- all'identificatore del \itindex{process~group}\textit{process group}. In
+ all'identificatore del \itindex{process~group} \textit{process group}. In
caso di errore viene restituito $-1$.
\item[\const{F\_SETOWN}] imposta, con il valore dell'argomento \param{arg},
l'identificatore del processo o del \itindex{process~group} \textit{process
valore nullo in caso di successo o $-1$ in caso di errore. Questa
funzionalità avanzata è trattata in dettaglio in
sez.~\ref{sec:file_asyncronous_lease}.
-\item[\const{F\_GETLEASE}] restituisce il tipo di \textit{file lease}
- \index{file!lease} che il processo detiene nei confronti del file descriptor
- \var{fd} o $-1$ in caso di errore. Con questo comando il terzo argomento può
- essere omesso. Questa funzionalità avanzata è trattata in dettaglio in
- sez.~\ref{sec:file_asyncronous_lease}.
+\item[\const{F\_GETLEASE}] restituisce il tipo di \index{file!lease}
+ \textit{file lease} che il processo detiene nei confronti del file
+ descriptor \var{fd} o $-1$ in caso di errore. Con questo comando il terzo
+ argomento può essere omesso. Questa funzionalità avanzata è trattata in
+ dettaglio in sez.~\ref{sec:file_asyncronous_lease}.
\item[\const{F\_NOTIFY}] attiva un meccanismo di notifica per cui viene
riportata al processo chiamante, tramite il segnale \const{SIGIO} (o altro
segnale specificato con \const{F\_SETSIG}) ogni modifica eseguita o
pertanto riprese più avanti quando affronteremo le problematiche ad esse
relative. In particolare le tematiche relative all'I/O asincrono e ai vari
meccanismi di notifica saranno trattate in maniera esaustiva in
-sez.~\ref{sec:file_asyncronous_access} mentre quelle relative al \textit{file
- locking}\index{file!locking} saranno esaminate in
+sez.~\ref{sec:file_asyncronous_access} mentre quelle relative al
+\index{file!locking} \textit{file locking} saranno esaminate in
sez.~\ref{sec:file_locking}). L'uso di questa funzione con i socket verrà
trattato in sez.~\ref{sec:sock_ctrl_func}.
Data la assoluta specificità della funzione, il cui comportamento varia da
dispositivo a dispositivo, non è possibile fare altro che dare una descrizione
sommaria delle sue caratteristiche; torneremo ad esaminare in
-seguito\footnote{per l'uso con i socket si veda
- sez.~\ref{sec:sock_ctrl_func}.} quelle relative ad alcuni casi specifici
-(ad esempio la gestione dei terminali è effettuata attraverso \func{ioctl} in
+seguito\footnote{per l'uso di \func{ioctl} con i socket si veda
+ sez.~\ref{sec:sock_ctrl_func}.} quelle relative ad alcuni casi specifici (ad
+esempio la gestione dei terminali è effettuata attraverso \func{ioctl} in
quasi tutte le implementazioni di Unix), qui riportiamo solo i valori di
alcuni comandi che sono definiti per ogni file:
\begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\const{FIOCLEX}] Imposta il flag di
- \textit{close-on-exec}\itindex{close-on-exec}.
-\item[\const{FIONCLEX}] Cancella il flag di
- \textit{close-on-exec}\itindex{close-on-exec}.
+\item[\const{FIOCLEX}] Imposta il flag di \itindex{close-on-exec}
+ \textit{close-on-exec}.
+\item[\const{FIONCLEX}] Cancella il flag di \itindex{close-on-exec}
+ \textit{close-on-exec}.
\item[\const{FIOASYNC}] Abilita l'I/O asincrono.
\item[\const{FIONBIO}] Abilita l'I/O in modalità non bloccante.
\end{basedescript}
-% TODO estendere la lista delle ioctl
+% TODO estendere la lista delle ioctl sui file
%%% Local Variables:
% LocalWords: SETOWN GETSIG SETSIG sigaction SIGINFO siginfo SETLEASE lease is
% LocalWords: truncate GETLEASE NOTIFY all'I AND ACCMODE ioctl everything argp
% LocalWords: framebuffer request ENOTTY CDROM nell'header magic number
-% LocalWords: FIOCLEX FIONCLEX FIOASYNC FIONBIO
+% LocalWords: FIOCLEX FIONCLEX FIOASYNC FIONBIO NOATIME