X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileunix.tex;h=2d297ec77c517d8f7a2515e8b2bc628a304092be;hp=e59fd0603d862100d8c68af41548434050e88836;hb=6f8e0ca42d3d0b97b5e5747798a1eaffb44e8521;hpb=fa6f00d7ff97c2b7e88a40885be73ae54824f139 diff --git a/fileunix.tex b/fileunix.tex index e59fd06..2d297ec 100644 --- a/fileunix.tex +++ b/fileunix.tex @@ -54,16 +54,16 @@ valore come argomento alle varie funzioni dell'interfaccia. 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 \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. @@ -199,9 +199,9 @@ un file descriptor, il suo prototipo \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}. @@ -226,10 +226,23 @@ un file descriptor, il suo prototipo \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 \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 @@ -239,122 +252,109 @@ valore pi \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}. 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 + 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. \\ \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 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 - \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]{\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}.} @@ -446,8 +446,8 @@ descriptor ritorna disponibile; il suo prototipo \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. @@ -503,8 +503,8 @@ ad un valore qualsiasi con la funzione \funcd{lseek}, il cui prototipo 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. @@ -570,7 +570,7 @@ prototipo \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. @@ -644,9 +644,9 @@ definizione di un'altra funzione di lettura, \funcd{pread}, il cui prototipo 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 @@ -683,7 +683,8 @@ scrivere su di esso utilizzando la funzione \funcd{write}, il cui prototipo 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. @@ -727,9 +728,9 @@ nel file, il suo prototipo 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}. @@ -924,8 +925,8 @@ usare le due funzioni \funcd{fsync} e \funcd{fdatasync}, i cui prototipi sono: \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. @@ -960,7 +961,7 @@ prototipo 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. @@ -1014,7 +1015,7 @@ prototipo 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. @@ -1066,8 +1067,8 @@ il cui prototipo 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. @@ -1086,73 +1087,75 @@ per \var{cmd} \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}\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. + 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 è @@ -1163,27 +1166,28 @@ per \var{cmd} (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 @@ -1191,8 +1195,8 @@ poter essere affrontate in tutti i loro aspetti a questo punto; saranno 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_asyncronous_access} mentre quelle relative al \textit{file + locking}\index{file!locking} saranno esaminate in sez.~\ref{sec:file_locking}). Si tenga presente infine che quando si usa la funzione per determinare le @@ -1233,7 +1237,7 @@ file descriptor. Il prototipo di questa funzione \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 @@ -1294,6 +1298,8 @@ file: \end{basedescript} relativi ad operazioni comunque eseguibili anche attraverso \func{fcntl}. +% TODO estendere la lista delle ioctl + %%% Local Variables: %%% mode: latex