%% fileunix.tex
%%
-%% Copyright (C) 2000-2005 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2000-2006 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 dei \textit{file descriptor}}
\label{sec:file_fd}
-\index{file!descriptor|(} Per poter accedere al contenuto di un file occorre
+\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
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 \textit{process table} ed un
-elenco dei file aperti nella \textit{file table}.
-
-La \textit{process table} è una tabella che contiene una voce per ciascun
-processo attivo nel sistema. In Linux ciascuna voce è costituita da una
-struttura di tipo \struct{task\_struct} nella quale sono raccolte tutte le
-informazioni relative al processo; fra queste informazioni c'è anche il
-puntatore ad una ulteriore struttura di tipo \struct{files\_struct}, in cui
-sono contenute le informazioni relative ai file che il processo ha aperto, ed
-in particolare:
+un elenco dei processi attivi nella cosiddetta \itindex{process~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 è
+costituita da una struttura di tipo \struct{task\_struct} nella quale sono
+raccolte tutte le informazioni relative al processo; fra queste informazioni
+c'è anche il puntatore ad una ulteriore struttura di tipo
+\struct{files\_struct}, in cui sono contenute le informazioni relative ai file
+che il processo ha aperto, ed in particolare:
\begin{itemize*}
\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
+\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 all'inode\index{inode} passando per la nuova struttura del VFS.}
del file.
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
\label{sec:file_open}
La funzione \funcd{open} è la funzione fondamentale per accedere ai file, ed è
-quella che crea l'associazione fra un
-\index{\textit{pathname}}\textit{pathname} ed un file descriptor, il suo
-prototipo è:
+quella che crea l'associazione fra un \itindex{pathname}\textit{pathname} ed
+un file descriptor, il suo prototipo è:
\begin{functions}
\headdecl{sys/types.h}
\headdecl{sys/stat.h}
\param{flags}, e, nel caso il file sia creato, con gli eventuali permessi
specificati da \param{mode}.
- \bodydesc{La funzione ritorna il file descriptor in caso di successo e -1 in
- caso di errore. In questo caso la variabile \var{errno} assumerà uno dei
- valori:
+ \bodydesc{La funzione ritorna il file descriptor in caso di successo e $-1$
+ in caso di errore. In questo caso la variabile \var{errno} assumerà uno
+ dei valori:
\begin{errlist}
\item[\errcode{EEXIST}] \param{pathname} esiste e si è specificato
\const{O\_CREAT} e \const{O\_EXCL}.
\errval{EMFILE} e \errval{ENFILE}.}
\end{functions}
-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}.
-Viene sempre restituito come valore di ritorno il file descriptor con il
-valore più basso disponibile.
+
+La funzione apre il file usando il primo file descriptor libero, e crea
+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
+ 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
\textbf{Flag} & \textbf{Descrizione} \\
\hline
\hline % modalità di accesso al file
- \const{O\_RDONLY} & apre il file in sola lettura, le \acr{glibc}
- definiscono anche \const{O\_READ} come sinonimo. \\
- \const{O\_WRONLY} & apre il file in sola scrittura, le \acr{glibc}
- definiscono anche \const{O\_WRITE} come sinonimo. \\
- \const{O\_RDWR} & apre il file sia in lettura che in scrittura. \\
+ \const{O\_RDONLY} & Apre il file in sola lettura, le \acr{glibc}
+ definiscono anche \const{O\_READ} come sinonimo. \\
+ \const{O\_WRONLY} & Apre il file in sola scrittura, le \acr{glibc}
+ definiscono anche \const{O\_WRITE} come sinonimo. \\
+ \const{O\_RDWR} & Apre il file sia in lettura che in scrittura. \\
\hline % modalità di apertura del file
\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. \\
- \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
- \func{open} con \errcode{EEXIST}. \\
- \const{O\_NONBLOCK}& apre il file in modalità non bloccante. Questo
- valore specifica anche una modalità di operazione (vedi
- sotto), e comporta che \func{open} ritorni
- immediatamente (l'opzione ha senso solo per le fifo,
- torneremo questo in sez.~\ref{sec:ipc_named_pipe}). \\
- \const{O\_NOCTTY}& se \param{pathname} si riferisce ad un dispositivo di
- terminale, questo non diventerà il terminale di
- controllo, anche se il processo non ne ha ancora uno
- (si veda sez.~\ref{sec:sess_ctrl_term}). \\
- \const{O\_SHLOCK} & opzione di BSD, acquisisce uno shared lock (vedi
- sez.~\ref{sec:file_locking}) sul file. Non è
- disponibile in Linux. \\
- \const{O\_EXLOCK} & opzione di BSD, acquisisce uno lock esclusivo (vedi
- sez.~\ref{sec:file_locking}) sul file. Non è
- disponibile in Linux. \\
- \const{O\_TRUNC} & se il file esiste ed è un file di dati e la modalità di
- apertura consente la scrittura, allora la sua
- lunghezza verrà troncata a zero. Se il file è un
- terminale o una fifo il flag verrà ignorato, negli
- altri casi il comportamento non è specificato. \\
- \const{O\_NOFOLLOW}&se \param{pathname} è un link simbolico la chiamata
- fallisce. Questa è un'estensione BSD aggiunta in Linux
- dal kernel 2.1.126. Nelle versioni precedenti i link
- simbolici sono sempre seguiti, e questa opzione è
- ignorata. \\
- \const{O\_DIRECTORY}& se \param{pathname} non è una directory la chiamata
- fallisce. Questo flag è specifico di Linux ed è stato
- introdotto con il kernel 2.1.126 per evitare dei
- \textit{DoS}\index{DoS}\protect\footnotemark\ quando
- \func{opendir} viene chiamata su una fifo o su un
- device di unità 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
- grandi dimensioni consente di aprire file le cui
- dimensioni non possono essere rappresentate da numeri
- a 31 bit. \\
+ \const{O\_CREAT} & Se il file non esiste verrà creato, con le regole di
+ titolarità del file viste in
+ 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
+ \func{open} con \errcode{EEXIST}. \\
+ \const{O\_NONBLOCK}& Apre il file in modalità non bloccante, e
+ comporta che \func{open} ritorni immediatamente anche
+ quando dovrebbe bloccarsi (l'opzione ha senso solo per
+ le fifo, vedi sez.~\ref{sec:ipc_named_pipe}). \\
+ \const{O\_NOCTTY} & Se \param{pathname} si riferisce ad un dispositivo di
+ terminale, questo non diventerà il terminale di
+ controllo, anche se il processo non ne ha ancora uno
+ (si veda sez.~\ref{sec:sess_ctrl_term}). \\
+ \const{O\_SHLOCK} & Apre il file con uno shared lock (vedi
+ sez.~\ref{sec:file_locking}). Specifica di BSD,
+ assente in Linux. \\
+ \const{O\_EXLOCK} & Apre il file con un lock esclusivo (vedi
+ sez.~\ref{sec:file_locking}). Specifica di BSD,
+ assente in Linux.\\
+ \const{O\_TRUNC} & Se usato su un file di dati aperto in scrittura,
+ ne tronca la lunghezza a zero; con un terminale o una
+ fifo viene ignorato, negli altri casi il
+ comportamento non è specificato. \\
+ \const{O\_NOFOLLOW}& Se \param{pathname} è un link simbolico la chiamata
+ fallisce. Questa è un'estensione BSD aggiunta in Linux
+ dal kernel 2.1.126. Nelle versioni precedenti i link
+ simbolici sono sempre seguiti, e questa opzione è
+ ignorata. \\
+ \const{O\_DIRECTORY}&Se \param{pathname} non è una directory la chiamata
+ fallisce. Questo flag è specifico di Linux ed è stato
+ introdotto con il kernel 2.1.126 per evitare dei
+ \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
+ grandi dimensioni consente di aprire file le cui
+ dimensioni non possono essere rappresentate da numeri
+ a 31 bit. \\
\hline
- \hline % modalità di operazione col file
- \const{O\_APPEND} & il file viene aperto in append mode. Prima di ciascuna
- scrittura la posizione corrente viene sempre impostata
- alla fine del file. Con NFS si può avere una
- corruzione del file se più di un processo scrive allo
- stesso tempo.\footnotemark\\
- \const{O\_NONBLOCK}&il file viene aperto in modalità non bloccante per
- le operazioni di I/O (che tratteremo in
- sez.~\ref{sec:file_noblocking}): questo significa il
- fallimento di \func{read} in assenza di dati da
- leggere e quello di \func{write} in caso di
- impossibilità di scrivere immediatamente. Questa
- modalità ha senso solo per le fifo e per alcuni file
- di dispositivo. \\
- \const{O\_NDELAY} & in Linux\footnotemark\ è sinonimo di
- \const{O\_NONBLOCK}.\\
- \const{O\_ASYNC} & apre il file per l'I/O in modalità asincrona (vedi
- sez.~\ref{sec:file_asyncronous_io}). Quando è
- impostato viene generato il segnale \const{SIGIO}
- tutte le volte che sono disponibili dati in input
- sul file. \\
- \const{O\_SYNC} & apre il file per l'input/output sincrono: ogni
- \func{write} bloccherà fino al completamento della
- scrittura di tutti i dati sull'hardware sottostante.\\
- \const{O\_FSYNC} & sinonimo di \const{O\_SYNC}, usato da BSD. \\
- \const{O\_DSYNC} & richiede una variante di I/O sincorno definita nello
- standard POSIX; definita a partire dal kernel 2.1.130
- come sinonimo di \const{O\_SYNC}. \\
- \const{O\_RSYNC} & richiede una variante di I/O sincorno definita nello
- standard POSIX; definita a partire dal kernel 2.1.130
- come sinonimo di \const{O\_SYNC}. \\
- \const{O\_NOATIME}& blocca l'aggiornamento dei tempi di accesso dei
- file (vedi sez.~\ref{sec:file_file_times}). Per molti
- filesystem questa funzionalità non è disponibile per
- il singolo file ma come opzione generale da
- specificare in fase di montaggio.\\
- \const{O\_DIRECT} & esegue l'I/O direttamente dai buffer in user space, ed
- in maniera sincrona, in modo da scavalcare i
- meccanismi di caching del kernel. In gebere questo
- peggiora le prestazioni tranne per casi speciali in
- cui sono le applicazioni\footnotemark a gestire il
- caching. Per i kernel della serie 2.4 si deve
- garantire che i buffer in user space siano allineati
- alle dimensioni dei blocchi del filesystem; per il
- kernel 2.6 basta che siano allineati a multipli di 512
- byte.\\
+ \hline % modalità di operazione coi file
+ \const{O\_APPEND} & Il file viene aperto in \itindex{append~mode}
+ \textit{append mode}. Prima di ciascuna
+ scrittura la posizione corrente viene sempre impostata
+ alla fine del file. Con NFS si può avere una
+ corruzione del file se più di un processo scrive allo
+ stesso tempo.\footnotemark\\
+ \const{O\_NONBLOCK}& Il file viene aperto in modalità non bloccante per
+ le operazioni di I/O (che tratteremo in
+ sez.~\ref{sec:file_noblocking}): questo significa il
+ fallimento di \func{read} in assenza di dati da
+ leggere e quello di \func{write} in caso di
+ impossibilità di scrivere immediatamente. Questa
+ modalità ha senso solo per le fifo e per alcuni file
+ di dispositivo. \\
+ \const{O\_NDELAY} & In Linux\footnotemark\ è sinonimo di
+ \const{O\_NONBLOCK}.\\
+ \const{O\_ASYNC} & Apre il file per l'I/O in modalità asincrona (vedi
+ sez.~\ref{sec:file_asyncronous_io}). Quando è
+ impostato viene generato il segnale \const{SIGIO}
+ tutte le volte che sono disponibili dati in input
+ sul file. \\
+ \const{O\_SYNC} & Apre il file per l'input/output sincrono: ogni
+ \func{write} bloccherà fino al completamento della
+ scrittura di tutti i dati sull'hardware
+ sottostante.\\
+ \const{O\_FSYNC} & sinonimo di \const{O\_SYNC}, usato da BSD. \\
+ \const{O\_DSYNC} & Variante di I/O sincrono definita da POSIX; presente
+ dal kernel 2.1.130 come sinonimo di
+ \const{O\_SYNC}. \\
+ \const{O\_RSYNC} & Variante analoga alla precedente, trattata allo stesso
+ modo. \\
+ \const{O\_NOATIME} & Blocca l'aggiornamento dei tempi di accesso dei
+ file (vedi sez.~\ref{sec:file_file_times}). Per molti
+ filesystem questa funzionalità non è disponibile per
+ il singolo file ma come opzione generale da
+ specificare in fase di montaggio.\\
+ \const{O\_DIRECT} & Esegue l'I/O direttamente dai buffer in user space
+ in maniera sincrona, in modo da scavalcare i
+ meccanismi di caching del kernel. In genere questo
+ peggiora le prestazioni tranne quando le
+ applicazioni\footnotemark ottimizzano il proprio
+ caching. Per i kernel della serie 2.4 si deve
+ garantire che i buffer in user space siano allineati
+ alle dimensioni dei blocchi del filesystem; per il
+ kernel 2.6 basta che siano allineati a multipli di 512
+ byte.\\
\hline
\end{tabular}
\caption{Valori e significato dei vari bit del \textit{file status flag}.}
\label{tab:file_open_flags}
\end{table}
-\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 race
- condition\index{\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]{\textit{Denial of Service}\index{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.}
-
-\footnotetext[4]{il problema è che NFS non supporta la scrittura in append, ed
- il kernel deve simularla, ma questo comporta la possibilità di una race
- condition, vedi sez.~\ref{sec:file_atomic}.}
+\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
+ condition}, vedi sez.~\ref{sec:file_atomic}.}
\footnotetext[5]{l'opzione origina da SVr4, dove però causava il ritorno da
una \func{read} con un valore nullo e non con un errore, questo introduce
introdotta con il kernel 2.4.10, le versioni precedenti la ignorano.}
-Questa caratteristica permette di prevedere qual'è il valore del file
+Questa caratteristica permette di prevedere qual è il valore del file
descriptor che si otterrà al ritorno di \func{open}, e viene talvolta usata da
alcune applicazioni per sostituire i file corrispondenti ai file standard
visti in sez.~\ref{sec:file_std_descr}: se ad esempio si chiude lo standard
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
\begin{prototype}{unistd.h}{int close(int fd)}
Chiude il descrittore \param{fd}.
- \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di errore,
- con \var{errno} che assume i valori:
+ \bodydesc{La funzione ritorna 0 in caso di successo e $-1$ in caso di
+ errore, con \var{errno} che assume i valori:
\begin{errlist}
\item[\errcode{EBADF}] \param{fd} non è un descrittore valido.
\item[\errcode{EINTR}] la funzione è stata interrotta da un segnale.
ed inoltre \errval{EIO}.}
\end{prototype}
-La chiusura di un file rilascia ogni blocco (il \textit{file
- locking}\index{file!locking} è trattato in sez.~\ref{sec:file_locking}) che
-il processo poteva avere acquisito su di esso; se \param{fd} è l'ultimo
+La chiusura di un file rilascia ogni blocco (il \textit{file locking}
+\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
lettura e scrittura avvengono a partire da questa posizione che viene
automaticamente spostata in avanti del numero di byte letti o scritti.
-In genere (a meno di non avere richiesto la modalità \const{O\_APPEND}) questa
-posizione viene impostata a zero all'apertura del file. È possibile impostarla
-ad un valore qualsiasi con la funzione \funcd{lseek}, il cui prototipo è:
+In genere (a meno di non avere richiesto la modalità \itindex{append~mode}
+\const{O\_APPEND}) questa posizione viene impostata a zero all'apertura del
+file. È possibile impostarla ad un valore qualsiasi con la funzione
+\funcd{lseek}, il cui prototipo è:
\begin{functions}
\headdecl{sys/types.h}
\headdecl{unistd.h}
Imposta la posizione attuale nel file.
\bodydesc{La funzione ritorna il valore della posizione corrente in caso di
- successo e -1 in caso di errore nel qual caso \var{errno} assumerà uno dei
- valori:
+ 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 \textit{race condition}
-\index{\textit{race~condition}}, vedi sez.~\ref{sec:file_atomic}).
+(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
questo caso la funzione ritorna l'errore \errcode{EPIPE}. Questo, oltre che per
\param{buf}.
\bodydesc{La funzione ritorna il numero di byte letti in caso di successo e
- -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
+ $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
\begin{errlist}
\item[\errcode{EINTR}] la funzione è stata interrotta da un segnale prima di
aver potuto leggere qualsiasi dato.
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
Cerca di leggere \param{count} byte dal file \param{fd}, a partire dalla
posizione \param{offset}, nel buffer \param{buf}.
-\bodydesc{La funzione ritorna il numero di byte letti in caso di successo e -1
- in caso di errore, nel qual caso \var{errno} assumerà i valori già visti per
- \func{read} e \func{lseek}.}
+\bodydesc{La funzione ritorna il numero di byte letti in caso di successo e
+ $-1$ in caso di errore, nel qual caso \var{errno} assumerà i valori già
+ visti per \func{read} e \func{lseek}.}
\end{prototype}
La funzione prende esattamente gli stessi argomenti di \func{read} con lo
stesso significato, a cui si aggiunge l'argomento \func{offset} che indica una
-posizione sul file. Indetico è il comportamento ed il valore di ritorno. La
+posizione sul file. Identico è il comportamento ed il valore di ritorno. La
funzione serve quando si vogliono leggere dati dal file senza modificare la
posizione corrente.
Scrive \param{count} byte dal buffer \param{buf} sul file \param{fd}.
\bodydesc{La funzione ritorna il numero di byte scritti in caso di successo
- e -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
+ e $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei
+ valori:
\begin{errlist}
\item[\errcode{EINVAL}] \param{fd} è connesso ad un oggetto che non consente
la scrittura.
Come nel caso di \func{read} la funzione tenta di scrivere \param{count} byte
a partire dalla posizione corrente nel file e sposta automaticamente la
posizione in avanti del numero di byte scritti. Se il file è aperto in
-modalità \const{O\_APPEND} i dati vengono sempre scritti alla fine del file.
-Lo standard POSIX richiede che i dati scritti siano immediatamente disponibili
-ad una \func{read} chiamata dopo che la \func{write} che li ha scritti è
-ritornata; ma dati i meccanismi di caching non è detto che tutti i filesystem
-supportino questa capacità.
+modalità \itindex{append~mode} \const{O\_APPEND} i dati vengono sempre scritti
+alla fine del file. Lo standard POSIX richiede che i dati scritti siano
+immediatamente disponibili ad una \func{read} chiamata dopo che la
+\func{write} che li ha scritti è ritornata; ma dati i meccanismi di caching
+non è detto che tutti i filesystem supportino questa capacità.
Se \param{count} è zero la funzione restituisce zero senza fare nient'altro.
Per i file ordinari il numero di byte scritti è sempre uguale a quello
Cerca di scrivere sul file \param{fd}, a partire dalla posizione
\param{offset}, \param{count} byte dal buffer \param{buf}.
-\bodydesc{La funzione ritorna il numero di byte letti in caso di successo e -1
- in caso di errore, nel qual caso \var{errno} assumerà i valori già visti per
- \func{write} e \func{lseek}.}
+\bodydesc{La funzione ritorna il numero di byte letti in caso di successo e
+ $-1$ in caso di errore, nel qual caso \var{errno} assumerà i valori già
+ visti per \func{write} e \func{lseek}.}
\end{prototype}
\noindent e per essa valgono le stesse considerazioni fatte per \func{pread}.
scrittura eccede la dimensione corrente del file questo verrà esteso
automaticamente con l'aggiornamento del campo \var{i\_size}
nell'inode\index{inode}.
-\item se un file è in modalità \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.
+\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.
\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
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 \textit{race
- condition}\index{\textit{race~condition}}: infatti può succedere che un
+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
Il problema è che usare due system call in successione non è un'operazione
atomica; il problema è stato risolto introducendo la modalità
-\const{O\_APPEND}. In questo caso infatti, come abbiamo descritto in
-precedenza, è il kernel che aggiorna automaticamente la posizione alla fine
-del file prima di effettuare la scrittura, e poi estende il file. Tutto questo
-avviene all'interno di una singola system call (la \func{write}) che non
-essendo interrompibile da un altro processo costituisce un'operazione atomica.
+\itindex{append~mode} \const{O\_APPEND}. In questo caso infatti, come abbiamo
+descritto in precedenza, è il kernel che aggiorna automaticamente la posizione
+alla fine del file prima di effettuare la scrittura, e poi estende il file.
+Tutto questo avviene all'interno di una singola system call (la \func{write})
+che non essendo interrompibile da un altro processo costituisce un'operazione
+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
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 race
-condition\index{\textit{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 \textit{race
+ condition}\itindex{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
\funcdecl{int fdatasync(int fd)}
Sincronizza i dati del file \param{fd}.
- \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di errore,
- nel qual caso \var{errno} assume i valori:
+ \bodydesc{La funzione ritorna 0 in caso di successo e $-1$ in caso di
+ errore, nel qual caso \var{errno} assume i valori:
\begin{errlist}
\item[\errcode{EINVAL}] \param{fd} è un file speciale che non supporta la
sincronizzazione.
Crea una copia del file descriptor \param{oldfd}.
\bodydesc{La funzione ritorna il nuovo file descriptor in caso di successo e
- -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei
+ $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei
valori:
\begin{errlist}
\item[\errcode{EBADF}] \param{oldfd} non è un file aperto.
della \textit{file table} a cui entrambi fanno riferimento). L'unica
differenza fra due file descriptor duplicati è che ciascuno avrà il suo
\textit{file descriptor flag}; a questo proposito va specificato che nel caso
-di \func{dup} il flag di \textit{close-on-exec}\index{\textit{close-on-exec}}
-(vedi sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_fcntl}) viene sempre
-cancellato nella copia.
+di \func{dup} il flag di \textit{close-on-exec}\itindex{close-on-exec} (vedi
+sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_fcntl}) viene sempre cancellato
+nella copia.
L'uso principale di questa funzione è per la redirezione dell'input e
dell'output fra l'esecuzione di una \func{fork} e la successiva \func{exec};
Dato che questa è l'operazione più comune, è prevista una diversa versione
della funzione, \funcd{dup2}, che permette di specificare esplicitamente
-qual'è il valore di file descriptor che si vuole avere come duplicato; il suo
+qual è il valore di file descriptor che si vuole avere come duplicato; il suo
prototipo è:
\begin{prototype}{unistd.h}{int dup2(int oldfd, int newfd)}
Rende \param{newfd} una copia del file descriptor \param{oldfd}.
\bodydesc{La funzione ritorna il nuovo file descriptor in caso di successo e
- -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
+ $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
\begin{errlist}
\item[\errcode{EBADF}] \param{oldfd} non è un file aperto o \param{newfd} ha
un valore fuori dall'intervallo consentito per i file descriptor.
allo stesso valore per il file descriptor).
La duplicazione dei file descriptor può essere effettuata anche usando la
-funzione di controllo dei file \func{fnctl} (che esamineremo in
+funzione di controllo dei file \func{fcntl} (che esamineremo in
sez.~\ref{sec:file_fcntl}) con il parametro \const{F\_DUPFD}. L'operazione ha
-la sintassi \code{fnctl(oldfd, F\_DUPFD, newfd)} e se si usa 0 come valore per
+la sintassi \code{fcntl(oldfd, F\_DUPFD, newfd)} e se si usa 0 come valore per
\param{newfd} diventa equivalente a \func{dup}.
La sola differenza fra le due funzioni\footnote{a parte la sintassi ed i
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 \textit{file locking}
+ \index{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},
sul file \param{fd}.
\bodydesc{La funzione ha valori di ritorno diversi a seconda
- dell'operazione. In caso di errore il valore di ritorno è sempre -1 ed il
- codice dell'errore è restituito nella variabile \var{errno}; i codici
+ dell'operazione. In caso di errore il valore di ritorno è sempre $-1$ ed
+ il codice dell'errore è restituito nella variabile \var{errno}; i codici
possibili dipendono dal tipo di operazione, l'unico valido in generale è:
\begin{errlist}
\item[\errcode{EBADF}] \param{fd} non è un file aperto.
\begin{basedescript}{\desclabelwidth{2.0cm}}
\item[\const{F\_DUPFD}] trova il primo file descriptor disponibile di valore
maggiore o uguale ad \param{arg} e ne fa una copia di \param{fd}. Ritorna il
- nuovo file descriptor in caso di successo e -1 in caso di errore. Gli errori
- possibili sono \errcode{EINVAL} se \param{arg} è negativo o maggiore del
- massimo consentito o \errcode{EMFILE} se il processo ha già raggiunto il
+ nuovo file descriptor in caso di successo e $-1$ in caso di errore. Gli
+ errori possibili sono \errcode{EINVAL} se \param{arg} è negativo o maggiore
+ del massimo consentito o \errcode{EMFILE} se il processo ha già raggiunto il
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}\index{\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.
+ \textit{close-on-exec}\itindex{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.
\item[\const{F\_GETFD}] ritorna il valore del \textit{file descriptor flag} di
- \param{fd} o -1 in caso di errore; se \const{FD\_CLOEXEC} è impostato i file
- descriptor aperti vengono chiusi attraverso una \func{exec} altrimenti (il
- comportamento predefinito) restano aperti.
+ \param{fd} o $-1$ in caso di errore; se \const{FD\_CLOEXEC} è impostato i
+ file descriptor aperti vengono chiusi attraverso una \func{exec} altrimenti
+ (il comportamento predefinito) restano aperti.
\item[\const{F\_GETFL}] ritorna il valore del \textit{file status flag} in
- caso di successo o -1 in caso di errore; permette cioè di rileggere quei bit
- impostati da \func{open} all'apertura del file che vengono memorizzati
+ caso di successo o $-1$ in caso di errore; permette cioè di rileggere quei
+ bit impostati da \func{open} all'apertura del file che vengono memorizzati
(quelli riportati nella prima e terza sezione di
tab.~\ref{tab:file_open_flags}).
\item[\const{F\_SETFL}] imposta il \textit{file status flag} al valore
- specificato da \param{arg}, ritorna un valore nullo in caso di successo o -1
- in caso di errore. Possono essere impostati solo i bit riportati nella terza
- sezione di tab.~\ref{tab:file_open_flags}.\footnote{la pagina di manuale
- riporta come impostabili solo \const{O\_APPEND}, \const{O\_NONBLOCK} e
- \const{O\_ASYNC}.}
+ specificato da \param{arg}, ritorna un valore nullo in caso di successo o
+ $-1$ in caso di errore. Possono essere impostati solo i bit riportati nella
+ terza sezione di tab.~\ref{tab:file_open_flags}.\footnote{la pagina di
+ manuale riporta come impostabili solo \const{O\_APPEND},
+ \const{O\_NONBLOCK} e \const{O\_ASYNC}.}
\item[\const{F\_GETLK}] richiede un controllo sul file lock specificato da
- \param{lock}, sovrascrivendo la struttura da esso puntata con il risultato,
- ritorna un valore nullo in caso di successo o -1 in caso di errore. Questa
+ \param{lock}, sovrascrivendo la struttura da esso puntata con il risultato;
+ ritorna un valore nullo in caso di successo o $-1$ in caso di errore. Questa
funzionalità è trattata in dettaglio in sez.~\ref{sec:file_posix_lock}.
\item[\const{F\_SETLK}] richiede o rilascia un file lock a seconda di quanto
specificato nella struttura puntata da \param{lock}. Se il lock è tenuto da
- qualcun'altro ritorna immediatamente restituendo -1 e imposta \var{errno} a
+ qualcun altro ritorna immediatamente restituendo $-1$ e imposta \var{errno} a
\errcode{EACCES} o \errcode{EAGAIN}, in caso di successo ritorna un valore
nullo. Questa funzionalità è trattata in dettaglio in
sez.~\ref{sec:file_posix_lock}.
\item[\const{F\_SETLKW}] identica a \const{F\_SETLK} eccetto per il fatto che
la funzione non ritorna subito ma attende che il blocco sia rilasciato. Se
- l'attesa viene interrotta da un segnale la funzione restituisce -1 e imposta
- \var{errno} a \errcode{EINTR}, in caso di successo ritorna un valore nullo.
- Questa funzionalità è trattata in dettaglio in
+ l'attesa viene interrotta da un segnale la funzione restituisce $-1$ e
+ imposta \var{errno} a \errcode{EINTR}, in caso di successo ritorna un valore
+ nullo. Questa funzionalità è trattata in dettaglio in
sez.~\ref{sec:file_posix_lock}.
\item[\const{F\_GETOWN}] restituisce il \acr{pid} del processo o
- l'identificatore del process group\footnote{i \texttt{process group} sono
+ l'identificatore del \itindex{process~group} \textit{process
+ group}\footnote{i \itindex{process~group} \textit{process group} sono
(vedi sez.~\ref{sec:sess_proc_group}) raggruppamenti di processi usati nel
controllo di sessione; a ciascuno di essi è associato un identificatore
(un numero positivo analogo al \acr{pid}).} che è preposto alla ricezione
dei segnali \const{SIGIO} e \const{SIGURG} per gli eventi associati al file
- descriptor \param{fd}. Nel caso di un process group viene restituito un
- valore negativo il cui valore assoluto corrisponde all'identificatore del
- process group. In caso di errore viene restituito -1.
+ 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
+ caso di errore viene restituito $-1$.
\item[\const{F\_SETOWN}] imposta, con il valore dell'argomento \param{arg},
- l'identificatore del processo o del \textit{process group} che riceverà i
- segnali \const{SIGIO} e \const{SIGURG} per gli eventi associati al file
- descriptor \param{fd}, ritorna un valore nullo in caso di successo o -1 in
- caso di errore. Come per \const{F\_GETOWN}, per impostare un
- \textit{process group} si deve usare per \param{arg} un valore negativo, il
- cui valore assoluto corrisponde all'identificatore del \textit{process
- group}.
+ l'identificatore del processo o del \itindex{process~group} \textit{process
+ group} che riceverà i segnali \const{SIGIO} e \const{SIGURG} per gli
+ eventi associati al file descriptor \param{fd}, ritorna un valore nullo in
+ caso di successo o $-1$ in caso di errore. Come per \const{F\_GETOWN}, per
+ impostare un \itindex{process~group} \textit{process group} si deve usare
+ per \param{arg} un valore negativo, il cui valore assoluto corrisponde
+ all'identificatore del \itindex{process~group} \textit{process group}.
\item[\const{F\_GETSIG}] restituisce il valore del segnale inviato quando ci
sono dati disponibili in ingresso su un file descriptor aperto ed impostato
per l'I/O asincrono (si veda sez.~\ref{sec:file_asyncronous_io}). Il valore 0
indica il valore predefinito (che è \const{SIGIO}), un valore diverso da
zero indica il segnale richiesto, (che può essere anche lo stesso
- \const{SIGIO}). In caso di errore ritorna -1.
+ \const{SIGIO}). In caso di errore ritorna $-1$.
\item[\const{F\_SETSIG}] imposta il segnale da inviare quando diventa
possibile effettuare I/O sul file descriptor in caso di I/O asincrono,
- ritorna un valore nullo in caso di successo o -1 in caso di errore. Il
+ ritorna un valore nullo in caso di successo o $-1$ in caso di errore. Il
valore zero indica di usare il segnale predefinito, \const{SIGIO}. Un altro
valore diverso da zero (compreso lo stesso \const{SIGIO}) specifica il
segnale voluto; l'uso di un valore diverso da zero permette inoltre, se si è
(come vedremo in sez.~\ref{sec:file_asyncronous_io}).\footnote{i due comandi
\const{F\_SETSIG} e \const{F\_GETSIG} sono una estensione specifica di
Linux.}
-\item[\const{F\_SETLEASE}] imposta o rimuove un \textit{file
- lease}\footnote{questa è una nuova funzionalità, specifica di Linux, e
- presente solo a partire dai kernel della serie 2.4.x, in cui il processo
- che detiene un \textit{lease} su un file riceve una notifica qualora un
- altro processo cerca di eseguire una \func{open} o una \func{truncate} su
- di esso.} sul file descriptor \var{fd} a seconda del valore del terzo
- argomento, che in questo caso è un \ctyp{int}, ritorna un valore nullo in
- caso di successo o -1 in caso di errore. Questa funzionalità avanzata è
- trattata in dettaglio in sez.~\ref{sec:file_asyncronous_operation}.
-\item[\const{F\_GETLEASE}] restituisce il tipo di \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
+\item[\const{F\_SETLEASE}] imposta o rimuove un \index{file!lease}
+ \textit{file lease}\footnote{questa è una nuova funzionalità, specifica di
+ Linux, e presente solo a partire dai kernel della serie 2.4.x, in cui il
+ processo che detiene un \textit{lease} su un file riceve una notifica
+ qualora un altro processo cerca di eseguire una \func{open} o una
+ \func{truncate} su di esso.} sul file descriptor \var{fd} a seconda del
+ valore del terzo argomento, che in questo caso è un \ctyp{int}, ritorna un
+ valore nullo in caso di successo o $-1$ in caso di errore. Questa
funzionalità avanzata è trattata in dettaglio in
- sez.~\ref{sec:file_asyncronous_operation}.
+ 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\_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
direttamente sulla directory cui \var{fd} fa riferimento, o su uno dei file
- in essa contenuti; ritorna un valore nullo in caso di successo o -1 in caso
+ in essa contenuti; ritorna un valore nullo in caso di successo o $-1$ in caso
di errore. Questa funzionalità avanzata, disponibile dai kernel della serie
- 2.4.x, è trattata in dettaglio in sez.~\ref{sec:file_asyncronous_operation}.
+ 2.4.x, è trattata in dettaglio in sez.~\ref{sec:file_asyncronous_lease}.
\end{basedescript}
La maggior parte delle funzionalità di \func{fcntl} sono troppo avanzate per
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_operation} mentre quelle relative al
-\textit{file locking}\index{file!locking} saranno esaminate in
-sez.~\ref{sec:file_locking}).
+sez.~\ref{sec:file_asyncronous_access} mentre quelle relative al \textit{file
+ locking}\index{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}.
Si tenga presente infine che quando si usa la funzione per determinare le
modalità di accesso con cui è stato aperto il file (attraverso l'uso del
\subsection{La funzione \func{ioctl}}
\label{sec:file_ioctl}
-Benché il concetto di \textit{everything is a file} si sia dimostratato molto
+Benché il concetto di \textit{everything is a file} si sia dimostrato molto
valido anche per l'interazione con i dispositivi più vari, fornendo una
interfaccia che permette di interagire con essi tramite le stesse funzioni
usate per i normali file di dati, esisteranno sempre caratteristiche
specifiche di ogni dispositivo particolare, usando come riferimento il solito
file descriptor. Il prototipo di questa funzione è:
\begin{prototype}{sys/ioctl.h}{int ioctl(int fd, int request, ...)}
- Manipola il dispositivo sottostante, usando il parametro \param{request} per
- specificare l'operazione richiesta ed il terzo parametro (usualmente di tipo
+ Manipola il dispositivo sottostante, usando l'argomento \param{request} per
+ specificare l'operazione richiesta ed il terzo argomento (usualmente di tipo
\param{char * argp} o \param{int argp}) per il trasferimento
dell'informazione necessaria.
\bodydesc{La funzione nella maggior parte dei casi ritorna 0, alcune
operazioni usano però il valore di ritorno per restituire informazioni. In
- caso di errore viene sempre restituito -1 ed \var{errno} assumerà uno dei
+ caso di errore viene sempre restituito $-1$ ed \var{errno} assumerà uno dei
valori:
\begin{errlist}
- \item[\errcode{ENOTTY}] il file \param{fd} non è associato con un device, o
- la richiesta non è applicabile all'oggetto a cui fa riferimento
- \param{fd}.
+ \item[\errcode{ENOTTY}] il file \param{fd} non è associato con un
+ dispositivo, o la richiesta non è applicabile all'oggetto a cui fa
+ riferimento \param{fd}.
\item[\errcode{EINVAL}] gli argomenti \param{request} o \param{argp} non sono
validi.
\end{errlist}
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 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:
+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
+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 bit di \textit{close on exec}.
-\item[\const{FIONCLEX}] Cancella il bit di \textit{close on exec}.
+\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{FIOASYNC}] Abilita l'I/O asincrono.
\item[\const{FIONBIO}] Abilita l'I/O in modalità non bloccante.
\end{basedescript}
relativi ad operazioni comunque eseguibili anche attraverso \func{fcntl}.
+
+% TODO estendere la lista delle ioctl
+
+
%%% Local Variables:
%%% mode: latex
%%% TeX-master: "gapil"
%%% End:
+
+% LocalWords: descriptor system call cap like kernel sez l'inode inode VFS tab
+% LocalWords: process table struct files flags pos all'inode dentry fig shell
+% LocalWords: error POSIX STDIN FILENO STDOUT STDERR unistd read write lseek
+% LocalWords: close pathname sys fcntl int const char errno EEXIST CREAT EXCL
+% LocalWords: EISDIR ENOTDIR ENXIO NOBLOCK WRONLY fifo ENODEV ETXTBSY ELOOP of
+% LocalWords: NOFOLLOW EACCES ENAMETOOLONG ENOENT EROFS EFAULT ENOSPC ENOMEM
+% LocalWords: EMFILE ENFILE NFS lock race condition Denial Service DoS RDONLY
+% LocalWords: glibc RDWR NONBLOCK NOCTTY SHLOCK shared BSD EXLOCK TRUNC device
+% LocalWords: opendir LARGEFILE APPEND append NDELAY ASYNC l'I SIGIO SYNC SVr
+% LocalWords: DSYNC RSYNC filesystem DIRECT caching SGI IRIX dell'I FreeBSD fd
+% LocalWords: fork exec umask SOURCE creat filedes EBADF EINTR EIO locking off
+% LocalWords: behind sync flush shutdown whence ESPIPE socket EINVAL INCR XTND
+% LocalWords: SEEK CUR EPIPE ssize void buf size count EAGAIN EWOULDBLOCK log
+% LocalWords: Specification pwrite pread EFBIG SIGPIPE nell'inode dall'inode
+% LocalWords: CLOEXEC stat fsync cache update l'update bdflush Documentation
+% LocalWords: fdatasync fstat ext dup oldfd newfd DUPFD cmd long arg flock pid
+% LocalWords: SETFD GETFD GETFL SETFL GETLK SETLK SETLKW GETOWN group SIGURG
+% 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 NOATIME