From d8d6fec662a11ed3f7b6377651eead05a77dd187 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Sat, 18 Feb 2012 22:22:59 +0000 Subject: [PATCH] Unificata sezione di fcntl e ioctl, reindicizzazione e nuovo materiale sui comandi di fcntl. --- fileadv.tex | 73 ++++---- filedir.tex | 33 ++-- fileio.tex | 450 ++++++++++++++++++++++++++++++++---------------- gapil.tex | 1 + intro.tex | 10 +- listati/dqblk.h | 18 +- prochand.tex | 6 +- signal.tex | 2 +- sockctrl.tex | 25 ++- tcpsock.tex | 5 +- 10 files changed, 391 insertions(+), 232 deletions(-) diff --git a/fileadv.tex b/fileadv.tex index a4ca6e2..9d43dd4 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -296,8 +296,8 @@ descriptor, il \textit{file lock} non viene rilasciato. La seconda interfaccia per l'\textit{advisory locking} disponibile in Linux è quella standardizzata da POSIX, basata sulla funzione \func{fcntl}. Abbiamo già trattato questa funzione nelle sue molteplici possibilità di utilizzo in -sez.~\ref{sec:file_fcntl}. Quando la si impiega per il \textit{file locking} -essa viene usata solo secondo il seguente prototipo: +sez.~\ref{sec:file_fcntl_ioctl}. Quando la si impiega per il \textit{file + locking} essa viene usata solo secondo il seguente prototipo: \begin{prototype}{fcntl.h}{int fcntl(int fd, int cmd, struct flock *lock)} Applica o rimuove un \textit{file lock} sul file \param{fd}. @@ -390,8 +390,9 @@ viene usato solo in caso di lettura, quando si chiama \func{fcntl} con Oltre a quanto richiesto tramite i campi di \struct{flock}, l'operazione effettivamente svolta dalla funzione è stabilita dal valore dall'argomento -\param{cmd} che, come già riportato in sez.~\ref{sec:file_fcntl}, specifica -l'azione da compiere; i valori relativi al \textit{file locking} sono tre: +\param{cmd} che, come già riportato in sez.~\ref{sec:file_fcntl_ioctl}, +specifica l'azione da compiere; i valori relativi al \textit{file locking} +sono tre: \begin{basedescript}{\desclabelwidth{2.0cm}} \item[\const{F\_GETLK}] verifica se il \textit{file lock} specificato dalla struttura puntata da \param{lock} può essere acquisito: in caso negativo @@ -2458,7 +2459,7 @@ ottenute leggendo in maniera ordinaria il file descriptor con una \func{read}, \section{L'accesso \textsl{asincrono} ai file} -\label{sec:file_asyncronous_access} +\label{sec:file_asyncronous_operation} Benché l'\textit{I/O multiplexing} sia stata la prima, e sia tutt'ora una fra le più diffuse modalità di gestire l'I/O in situazioni complesse in cui si @@ -2474,7 +2475,7 @@ operazioni di I/O volute. \subsection{Il \textit{Signal driven I/O}} -\label{sec:file_asyncronous_operation} +\label{sec:file_signal_driven_io} \itindbeg{signal~driven~I/O} @@ -2482,12 +2483,12 @@ Abbiamo accennato in sez.~\ref{sec:file_open_close} che è definito un flag \const{O\_ASYNC}, che consentirebbe di aprire un file in modalità asincrona, anche se in realtà è opportuno attivare in un secondo tempo questa modalità impostando questo flag attraverso l'uso di \func{fcntl} con il comando -\const{F\_SETFL} (vedi sez.~\ref{sec:file_fcntl}).\footnote{l'uso del flag di - \const{O\_ASYNC} e dei comandi \const{F\_SETOWN} e \const{F\_GETOWN} per - \func{fcntl} è specifico di Linux e BSD.} In realtà parlare di apertura in -modalità asincrona non significa che le operazioni di lettura o scrittura del -file vengono eseguite in modo asincrono (tratteremo questo, che è ciò che più -propriamente viene chiamato \textsl{I/O asincrono}, in +\const{F\_SETFL} (vedi sez.~\ref{sec:file_fcntl_ioctl}).\footnote{l'uso del + flag di \const{O\_ASYNC} e dei comandi \const{F\_SETOWN} e \const{F\_GETOWN} + per \func{fcntl} è specifico di Linux e BSD.} In realtà parlare di apertura +in modalità asincrona non significa che le operazioni di lettura o scrittura +del file vengono eseguite in modo asincrono (tratteremo questo, che è ciò che +più propriamente viene chiamato \textsl{I/O asincrono}, in sez.~\ref{sec:file_asyncronous_io}), quanto dell'attivazione un meccanismo di notifica asincrona delle variazione dello stato del file descriptor aperto in questo modo. @@ -2498,7 +2499,7 @@ Quello che succede è che per tutti i file posti in questa modalità\footnote{si kernel 2.6, anche per fifo e pipe.} il sistema genera un apposito segnale, \signal{SIGIO}, tutte le volte che diventa possibile leggere o scrivere dal file descriptor che si è posto in questa modalità. Inoltre è possibile, come -illustrato in sez.~\ref{sec:file_fcntl}, selezionare con il comando +illustrato in sez.~\ref{sec:file_fcntl_ioctl}, selezionare con il comando \const{F\_SETOWN} di \func{fcntl} quale processo o quale gruppo di processi dovrà ricevere il segnale. In questo modo diventa possibile effettuare le operazioni di I/O in risposta alla ricezione del segnale, e non ci sarà più la @@ -2612,7 +2613,7 @@ standardizzate, che sono disponibili soltanto su Linux (anche se altri kernel supportano meccanismi simili). Alcune di esse sono realizzate, e solo a partire dalla versione 2.4 del kernel, attraverso l'uso di alcuni \textsl{comandi} aggiuntivi per la funzione \func{fcntl} (vedi -sez.~\ref{sec:file_fcntl}), che divengono disponibili soltanto se si è +sez.~\ref{sec:file_fcntl_ioctl}), che divengono disponibili soltanto se si è definita la macro \macro{\_GNU\_SOURCE} prima di includere \headfile{fcntl.h}. \itindbeg{file~lease} @@ -2641,13 +2642,14 @@ un altro processo esegue l'apertura del file in scrittura o usa il file viene aperto in lettura; in quest'ultimo caso però il \textit{lease} può essere ottenuto solo se nessun altro processo ha aperto lo stesso file. -Come accennato in sez.~\ref{sec:file_fcntl} il comando di \func{fcntl} che -consente di acquisire un \textit{file lease} è \const{F\_SETLEASE}, che viene -utilizzato anche per rilasciarlo. In tal caso il file descriptor \param{fd} -passato a \func{fcntl} servirà come riferimento per il file su cui si vuole -operare, mentre per indicare il tipo di operazione (acquisizione o rilascio) -occorrerà specificare come valore dell'argomento \param{arg} di \func{fcntl} -uno dei tre valori di tab.~\ref{tab:file_lease_fctnl}. +Come accennato in sez.~\ref{sec:file_fcntl_ioctl} il comando di \func{fcntl} +che consente di acquisire un \textit{file lease} è \const{F\_SETLEASE}, che +viene utilizzato anche per rilasciarlo. In tal caso il file +descriptor \param{fd} passato a \func{fcntl} servirà come riferimento per il +file su cui si vuole operare, mentre per indicare il tipo di operazione +(acquisizione o rilascio) occorrerà specificare come valore +dell'argomento \param{arg} di \func{fcntl} uno dei tre valori di +tab.~\ref{tab:file_lease_fctnl}. \begin{table}[htb] \centering @@ -2873,16 +2875,15 @@ Inoltre trattandosi di un file descriptor a tutti gli effetti, esso potrà essere utilizzato come argomento per le funzioni \func{select} e \func{poll} e con l'interfaccia di \textit{epoll};\footnote{ed a partire dal kernel 2.6.25 è stato introdotto anche il supporto per il \itindex{signal~driven~I/O} - \texttt{signal-driven I/O} trattato in - sez.~\ref{sec:file_asyncronous_operation}.} siccome gli eventi vengono -notificati come dati disponibili in lettura, dette funzioni ritorneranno tutte -le volte che si avrà un evento di notifica. Così, invece di dover utilizzare i -segnali,\footnote{considerati una pessima scelta dal punto di vista - dell'interfaccia utente.} si potrà gestire l'osservazione degli eventi con -una qualunque delle modalità di \textit{I/O multiplexing} illustrate in -sez.~\ref{sec:file_multiplexing}. Qualora si voglia cessare l'osservazione, -sarà sufficiente chiudere il file descriptor e tutte le risorse allocate -saranno automaticamente rilasciate. + \texttt{signal-driven I/O} trattato in sez.~\ref{sec:signal_driven_io}.} +siccome gli eventi vengono notificati come dati disponibili in lettura, dette +funzioni ritorneranno tutte le volte che si avrà un evento di notifica. Così, +invece di dover utilizzare i segnali,\footnote{considerati una pessima scelta + dal punto di vista dell'interfaccia utente.} si potrà gestire l'osservazione +degli eventi con una qualunque delle modalità di \textit{I/O multiplexing} +illustrate in sez.~\ref{sec:file_multiplexing}. Qualora si voglia cessare +l'osservazione, sarà sufficiente chiudere il file descriptor e tutte le +risorse allocate saranno automaticamente rilasciate. Infine l'interfaccia di \textit{inotify} consente di mettere sotto osservazione, oltre che una directory, anche singoli file. Una volta creata @@ -3105,11 +3106,11 @@ permette di ottenere con \func{ioctl}, come per i file descriptor associati ai socket (si veda sez.~\ref{sec:sock_ioctl_IP}) il numero di byte disponibili in lettura sul file descriptor, utilizzando su di esso l'operazione \const{FIONREAD}.\footnote{questa è una delle operazioni speciali per i file - (vedi sez.~\ref{sec:file_ioctl}), che è disponibile solo per i socket e per - i file descriptor creati con \func{inotify\_init}.} Si può così utilizzare -questa operazione, oltre che per predisporre una operazione di lettura con un -buffer di dimensioni adeguate, anche per ottenere rapidamente il numero di -file che sono cambiati. + (vedi sez.~\ref{sec:file_fcntl_ioctl}), che è disponibile solo per i socket + e per i file descriptor creati con \func{inotify\_init}.} Si può così +utilizzare questa operazione, oltre che per predisporre una operazione di +lettura con un buffer di dimensioni adeguate, anche per ottenere rapidamente +il numero di file che sono cambiati. Una volta effettuata la lettura con \func{read} a ciascun evento sarà associata una struttura \struct{inotify\_event} contenente i rispettivi dati. diff --git a/filedir.tex b/filedir.tex index 7720071..23430d4 100644 --- a/filedir.tex +++ b/filedir.tex @@ -78,7 +78,7 @@ verrà inserita nella tabella, ed il nuovo filesystem comparirà in \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{\textwidth} + \begin{minipage}[c]{0.80\textwidth} \includestruct{listati/file_system_type.h} \end{minipage} \normalsize @@ -178,7 +178,7 @@ struttura viene allocata e trascritti all'indietro se modificati. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{\textwidth} + \begin{minipage}[c]{0.8\textwidth} \includestruct{listati/inode.h} \end{minipage} \normalsize @@ -279,7 +279,7 @@ di dati) dovrà invece ricorrere a quelle fornite dal driver del dispositivo. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{\textwidth} + \begin{minipage}[c]{0.8\textwidth} \includestruct{listati/file.h} \end{minipage} \normalsize @@ -312,7 +312,7 @@ tab.~\ref{tab:file_file_operations} le più significative. \textsl{\code{llseek}} & Sposta la posizione corrente sul file (vedi sez.~\ref{sec:file_lseek}).\\ \textsl{\code{ioctl}} & Accede alle operazioni di controllo - (vedi sez.~\ref{sec:file_ioctl}).\\ + (vedi sez.~\ref{sec:file_fcntl_ioctl}).\\ \textsl{\code{readdir}}& Legge il contenuto di una directory (vedi sez.~\ref{sec:file_dir_read}).\\ \textsl{\code{poll}} & Usata nell'I/O multiplexing (vedi @@ -813,7 +813,7 @@ nell'elenco seguente: tutte le directory del filesystem, ma su alcuni filesystem è possibile impostarla a livello di singole directory o per i sottorami di una directory con il comando \cmd{chattr}.\footnote{questo avviene tramite delle opportune - \texttt{ioctl} (vedi sez.~\ref{sec:file_ioctl}).} + \texttt{ioctl} (vedi sez.~\ref{sec:file_fcntl_ioctl}).} Questo consente di ridurre al minimo il rischio di perdita dei dati delle directory in caso di crollo improvviso del sistema, al costo di una certa @@ -1244,7 +1244,7 @@ del filesystem stesso. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{\textwidth} + \begin{minipage}[c]{0.8\textwidth} \includestruct{listati/statfs.h} \end{minipage} \normalsize @@ -2168,7 +2168,7 @@ restituito il valore \val{NULL}. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{\textwidth} + \begin{minipage}[c]{0.8\textwidth} \includestruct{listati/dirent.c} \end{minipage} \normalsize @@ -3134,7 +3134,7 @@ sez.~\ref{sec:file_file_times}). \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{\textwidth} + \begin{minipage}[c]{0.8\textwidth} \includestruct{listati/stat.h} \end{minipage} \normalsize @@ -3151,7 +3151,7 @@ introdotti per rendersi indipendenti dalla piattaforma. Benché la descrizione dei commenti di fig.~\ref{fig:file_stat_struct} sia abbastanza chiara, vale la pena illustrare maggiormente il significato dei -campi di \structd{stat} su cui non torneremo in maggior dettaglio nel resto di +campi di \struct{stat} su cui non torneremo in maggior dettaglio nel resto di questa sezione: \begin{itemize*} @@ -3630,7 +3630,7 @@ puntatore nullo verrà impostato il tempo corrente. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{\textwidth} + \begin{minipage}[c]{0.8\textwidth} \includestruct{listati/utimbuf.h} \end{minipage} \normalsize @@ -3696,7 +3696,7 @@ puntatore nullo di nuovo verrà utilizzato il tempo corrente. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{\textwidth} + \begin{minipage}[c]{0.8\textwidth} \includestruct{listati/timeval.h} \end{minipage} \normalsize @@ -3789,7 +3789,7 @@ un valore dei tempi con una precisione fino al nanosecondo. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{\textwidth} + \begin{minipage}[c]{0.8\textwidth} \includestruct{listati/timespec.h} \end{minipage} \normalsize @@ -6179,7 +6179,7 @@ singolo utente o gruppo. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{\textwidth} + \begin{minipage}[c]{0.9\textwidth} \includestruct{listati/dqblk.h} \end{minipage} \normalsize @@ -6296,7 +6296,7 @@ la cui definizione è riportata in fig.~\ref{fig:dqinfo_struct}. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{\textwidth} + \begin{minipage}[c]{0.8\textwidth} \includestruct{listati/dqinfo.h} \end{minipage} \normalsize @@ -6997,7 +6997,8 @@ sez.~\ref{sec:file_xattr} e \ref{sec:file_ACL}), poter ignorare lo \itindex{sticky~bit} \textit{sticky bit} nella cancellazione dei file (vedi sez.~\ref{sec:file_special_perm}), la possibilità di impostare il flag di \const{O\_NOATIME} con \func{open} e \func{fcntl} (vedi -sez.~\ref{sec:file_open_close} e sez.~\ref{sec:file_fcntl}) senza restrizioni. +sez.~\ref{sec:file_open_close} e sez.~\ref{sec:file_fcntl_ioctl}) senza +restrizioni. Una seconda capacità che copre diverse operazioni, in questo caso riguardanti la rete, è \const{CAP\_NET\_ADMIN}, che consente di impostare le opzioni @@ -7092,7 +7093,7 @@ presente.\footnote{e non è chiaro neanche quanto sia mai stato davvero \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{\textwidth} + \begin{minipage}[c]{0.8\textwidth} \includestruct{listati/cap_user_header_t.h} \end{minipage} \normalsize diff --git a/fileio.tex b/fileio.tex index 7859510..03905c6 100644 --- a/fileio.tex +++ b/fileio.tex @@ -354,13 +354,13 @@ equivalente a \const{O\_RDWR}, e non deve essere usata.\footnote{in realtà driver, in cui si richiede la verifica della capacità di accesso in lettura e scrittura ma viene restituito un file descriptor che non può essere letto o scritto, ma solo usato con una \func{ioctl} (vedi - sez.~\ref{sec:file_ioctl}).} + sez.~\ref{sec:file_fcntl_ioctl}).} La modalità di accesso deve sempre essere specificata quando si apre un file, il valore indicato in \param{flags} viene salvato nei \itindex{file~status~flag} \textit{file status flags}, e può essere riletto -con \func{fcntl} (vedi sez.~\ref{sec:file_fcntl}), il relativo valore può -essere poi ottenuto un AND aritmetico della maschera binaria +con \func{fcntl} (vedi sez.~\ref{sec:file_fcntl_ioctl}), il relativo valore +può essere poi ottenuto un AND aritmetico della maschera binaria \const{O\_ACCMODE}, ma non può essere modificato. Nella \acr{glibc} sono definite inoltre \const{O\_READ} come sinonimo di \const{O\_RDONLY} e \const{O\_WRITE} come sinonimo di \const{O\_WRONLY}.\footnote{si tratta di @@ -379,7 +379,7 @@ permettono di specificare alcune delle caratteristiche del comportamento di \func{open} nel momento in viene eseguita per aprire un file. Questi flag hanno effetto solo nella chiamata della funzione, non sono memorizzati fra i \itindex{file~status~flag} \textit{file status flags} e non possono essere -riletti da \func{fcntl} (vedi sez.~\ref{sec:file_fcntl}). +riletti da \func{fcntl} (vedi sez.~\ref{sec:file_fcntl_ioctl}). \begin{table}[htb] \centering @@ -496,7 +496,7 @@ si tronca il file con \const{O\_TRUNC} verranno impostati soltanto il condition} con una sovrapposizione dei dati se più di un processo scrive allo stesso tempo. \\ \const{O\_ASYNC} & Apre il file per l'I/O in modalità asincrona (vedi - sez.~\ref{sec:file_asyncronous_io}). Quando è + sez.~\ref{sec:signal_driven_io}). Quando è impostato viene generato il segnale \signal{SIGIO} tutte le volte che il file è pronto per le operazioni di lettura o scrittura. Questo flag si @@ -515,7 +515,7 @@ si tronca il file con \const{O\_TRUNC} verranno impostati soltanto il che si potrebbe verificare con i \textit{thread} fra l'apertura del file e l'impostazione della suddetta modalità con \func{fcntl} (vedi - sez.~\ref{sec:file_fcntl}).\\ + sez.~\ref{sec:file_fcntl_ioctl}).\\ \const{O\_DIRECT} & Esegue l'I/O direttamente dalla memoria in \textit{user space} in maniera sincrona, in modo da scavalcare i meccanismi di bufferizzazione del @@ -542,7 +542,7 @@ si tronca il file con \const{O\_TRUNC} verranno impostati soltanto il fifo, vedi sez.~\ref{sec:ipc_named_pipe}), o quando si vuole aprire un file di dispositivo per eseguire una \func{ioctl} (vedi - sez.~\ref{sec:file_ioctl}).\\ + sez.~\ref{sec:file_fcntl_ioctl}).\\ \const{O\_NDELAY} & In Linux è un sinonimo di \const{O\_NONBLOCK}, ma origina da SVr4, dove però causava il ritorno da una \func{read} con un valore nullo e non con un @@ -578,7 +578,7 @@ mantenuto per ogni singolo file descriptor, vengono salvati nel campo ma possono venire riletti in un secondo tempo con \func{fcntl}, inoltre alcuni di essi possono anche essere modificati tramite questa funzione, con conseguente effetto sulle caratteristiche operative che controllano (torneremo -sull'argomento in sez.~\ref{sec:file_fcntl}). +sull'argomento in sez.~\ref{sec:file_fcntl_ioctl}). Il flag \const{O\_ASYNC} (che, per per compatibilità con BSD, si può indicare anche con la costante \const{FASYNC}) è definito come possibile valore per @@ -589,7 +589,7 @@ esplicitamente disattivato prima di essere attivato in maniera effettiva con l'uso di \func{fcntl}. Per questo motivo, non essendovi nessuna necessità specifica di definirlo in fase di apertura del file, è sempre opportuno attivarlo in un secondo tempo con \func{fcntl} (vedi -sez.~\ref{sec:file_fcntl}). +sez.~\ref{sec:file_fcntl_ioctl}). Il flag \const{O\_DIRECT} non è previsto da nessuno standard, anche se è presente in alcuni kernel unix-like.\footnote{il flag è stato introdotto dalla @@ -905,7 +905,7 @@ preallocata con \func{fallocate}, vedi sez.~\ref{sec:file_fadvise}) oltre a quelle classiche appena esposte. Questo significa che l'uso di questi nuovi valori non garantisce la mappatura della effettiva allocazione dello spazio disco di un file, per il quale esiste una specifica operazione di controllo -(vedi sez.~\ref{sec:file_ioctl}). +(vedi sez.~\ref{sec:file_fcntl_ioctl}). @@ -1196,7 +1196,7 @@ figlio che occorre tenere presente. Si noti inoltre che in questo caso anche i \itindex{file~status~flag} flag di stato del file, essendo mantenuti nella struttura \kstruct{file} della \textit{file table}, vengono condivisi, per cui una modifica degli stessi con -\func{fcntl} (vedi sez.~\ref{sec:file_fcntl}) si applicherebbe a tutti +\func{fcntl} (vedi sez.~\ref{sec:file_fcntl_ioctl}) si applicherebbe a tutti processi che condividono la voce nella \itindex{file~table} \textit{file table}. Ai file però sono associati anche altri flag, dei quali l'unico usato al momento è \const{FD\_CLOEXEC}, detti \itindex{file~descriptor~flags} @@ -1301,7 +1301,7 @@ suo \textit{file descriptor flag} indipendente. A questo proposito deve essere tenuto presente che nel caso in cui si usi \func{dup} per duplicare un file descriptor, se questo ha il flag di \textit{close-on-exec} \itindex{close-on-exec} attivo (vedi sez.~\ref{sec:proc_exec} e -sez.~\ref{sec:file_fcntl}), questo verrà cancellato nel file descriptor +sez.~\ref{sec:file_fcntl_ioctl}), questo verrà cancellato nel file descriptor restituito come copia. L'uso principale di questa funzione è nella shell per la redirezione dei file @@ -1382,7 +1382,7 @@ ritentare l'operazione. La duplicazione dei file descriptor può essere effettuata anche usando la funzione di controllo dei file \func{fcntl} (che esamineremo in -sez.~\ref{sec:file_fcntl}) con il parametro \const{F\_DUPFD}. L'operazione ha +sez.~\ref{sec:file_fcntl_ioctl}) con il parametro \const{F\_DUPFD}. L'operazione ha 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 (a parte la sintassi ed i diversi codici di errore) è che \func{dup2} @@ -1862,21 +1862,21 @@ precisione fino al nanosecondo. % http://pubs.opengroup.org/onlinepubs/9699939699/toc.pdf -\subsection{La funzione \func{fcntl}} -\label{sec:file_fcntl} +\subsection{Le operazioni di controllo} +\label{sec:file_fcntl_ioctl} Oltre alle operazioni base esaminate in sez.~\ref{sec:file_unix_interface} esistono tutta una serie di operazioni ausiliarie che è possibile eseguire su un file descriptor, che non riguardano la normale lettura e scrittura di dati, ma la 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 \itindex{file~locking} - \textit{file locking} (vedi sez.~\ref{sec:file_locking}).} +funzionalità che il kernel può mettere a disposizione. -Per queste operazioni di manipolazione e di controllo delle varie proprietà e +Per le operazioni di manipolazione e di controllo delle varie proprietà e caratteristiche di un file descriptor, viene usata la funzione di sistema -\funcd{fcntl}, il cui prototipo è: +\funcd{fcntl},\footnote{ad esempio si gestiscono con questa funzione varie + modalità di I/O asincrono (vedi sez.~\ref{sec:file_asyncronous_operation}) e + il \itindex{file~locking} \textit{file locking} (vedi + sez.~\ref{sec:file_locking}).} il cui prototipo è: \begin{funcproto}{ \fhead{unistd.h} @@ -1884,6 +1884,7 @@ caratteristiche di un file descriptor, viene usata la funzione di sistema \fdecl{int fcntl(int fd, int cmd)} \fdecl{int fcntl(int fd, int cmd, long arg)} \fdecl{int fcntl(int fd, int cmd, struct flock * lock)} +\fdecl{int fcntl(int fd, int cmd, struct f\_owner\_ex * owner)} \fdesc{Esegue una operazione di controllo sul file.} } @@ -1900,151 +1901,306 @@ caratteristiche di un file descriptor, viene usata la funzione di sistema Il primo argomento della funzione è sempre il numero di file descriptor \var{fd} su cui si vuole operare. Il comportamento di questa funzione, il numero e il tipo degli argomenti, il valore di ritorno e gli eventuali errori -sono determinati dal valore dell'argomento \param{cmd} che in sostanza -corrisponde all'esecuzione di un determinato \textsl{comando}; in -sez.~\ref{sec:file_dup} abbiamo incontrato un esempio dell'uso di \func{fcntl} -per la duplicazione dei file descriptor, una lista di tutti i possibili valori -per \var{cmd} è riportata di seguito: +aggiuntivi, sono determinati dal valore dell'argomento \param{cmd} che in +sostanza corrisponde all'esecuzione di un determinato \textsl{comando}. A +seconda del comando specificato il terzo argomento può essere assente (ma se +specificato verrà ignorato), può assumere un valore intero di tipo +\ctyp{long}, o essere un puntatore ad una struttura \struct{flock}. + +In sez.~\ref{sec:file_dup} abbiamo incontrato un esempio dell'uso di +\func{fcntl} per la duplicazione dei file descriptor, una lista di tutti i +possibili valori per \var{cmd}, e del relativo significato, dei codici di +errore restituiti e del tipo del terzo argomento (cui faremo riferimento con +il nome indicato nel precedente prototipo), è riportata di seguito: \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 - massimo numero di descrittori consentito. + maggiore o uguale ad \param{arg}, e ne fa un duplicato + di \param{fd}, ritorna il nuovo file descriptor in caso di successo e $-1$ + in caso di errore. Oltre a \errval{EBADF} 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\_DUPFD\_CLOEXEC}] ha lo stesso effetto di \const{F\_DUPFD}, ma in più attiva il flag di \itindex{close-on-exec} \textit{close-on-exec} sul - nuovo file descriptor duplicato, in modo da evitare una successiva chiamata - con \const{F\_SETFD}. Introdotta con il kernel 2.6.24. + file descriptor duplicato, in modo da evitare una successiva chiamata con + \const{F\_SETFD}. La funzionalità è stata introdotta con il kernel 2.6.24 ed + è prevista nello standard POSIX.1-2008 (si deve perciò definire + \macro{\_POSIX\_C\_SOURCE} ad un valore adeguato secondo quanto visto in + sez.~\ref{sec:intro_gcc_glibc_std}). + \item[\const{F\_GETFD}] ritorna il valore dei \textit{file descriptor flags} di - \param{fd} o $-1$ in caso di errore, \param{arg} viene ignorato. Se - \const{FD\_CLOEXEC} è impostato i file descriptor aperti vengono chiusi - attraverso una \func{exec} altrimenti (il comportamento predefinito) restano - aperti. -\item[\const{F\_SETFD}] imposta il valore dei \textit{file descriptor flags} al - valore specificato con \param{arg}. Al momento l'unico bit usato è quello di + \param{fd} in caso di successo o $-1$ in caso di errore, il terzo argomento + viene ignorato. Non sono previsti errori diversi da \errval{EBADF}. Al + momento l'unico flag usato è quello di \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}). Un valore nullo significa + pertanto che il flag non è impostato. + +\item[\const{F\_SETFD}] imposta il valore dei \textit{file descriptor flags} + al valore specificato con \param{arg}, ritorna un valore nullo in caso di + successo e $-1$ in caso di errore. Non sono previsti errori diversi da + \errval{EBADF}. Dato che l'unico flag attualmente usato è quello di \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. -\item[\const{F\_GETFL}] ritorna il valore dei \textit{file status flags} in - caso di successo o $-1$ in caso di errore; permette cioè di rileggere quei - valori dell'argomento \param{flags} di \func{open} che vengono memorizzati, - più precisamente quelli riportati in tab.~\ref{tab:open_access_mode_flag} e + \const{FD\_CLOEXEC}, tutti gli altri bit di \param{arg}, anche se impostati, + vengono ignorati.\footnote{questo almeno è quanto avviene fino al kernel + 3.2, come si può evincere dal codice della funzione \texttt{do\_fcntl} nel + file \texttt{fs/fcntl.c} dei sorgenti del kernel.} + +\item[\const{F\_GETFL}] ritorna il valore dei \textit{file status flags} di + \param{fd} in caso di successo o $-1$ in caso di errore, il terzo argomento + viene ignorato. Non sono previsti errori diversi da \errval{EBADF}. Il + comando permette di rileggere il valore di quei bit + dell'argomento \param{flags} di \func{open} che vengono memorizzati nella + relativa voce della \textit{file table} all'apertura del file, vale a dire + quelli riportati in tab.~\ref{tab:open_access_mode_flag} e tab.~\ref{tab:open_operation_flag}). -\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 flag fra quelli - riportati in tab.~\ref{tab:open_operation_flag}. su Linux si possono + +\item[\const{F\_SETFL}] imposta il valore dei \textit{file status flags} al + valore specificato da \param{arg}, ritorna un valore nullo in caso di + successo o $-1$ in caso di errore. In generale possono essere impostati solo + i flag riportati in tab.~\ref{tab:open_operation_flag}, su Linux si possono modificare soltanto \const{O\_APPEND}, \const{O\_ASYNC}, \const{O\_DIRECT}, - \const{O\_NOATIME} e \const{O\_NONBLOCK}. + \const{O\_NOATIME} e \const{O\_NONBLOCK}. Oltre a \errval{EBADF} si otterrà + \errcode{EPERM} se si cerca di rimuovere \const{O\_APPEND} da un file + marcato come \textit{append-only} o se di cerca di impostare + \const{O\_NOATIME} su un file di cui non si è proprietari (e non si hanno i + permessi di amministatore) ed \errcode{EINVAL} se si cerca di impostare + \const{O\_DIRECT} su un file che non supporta questo tipo di operazioni. + \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. Come + per i due successivi comandi oltre a \errval{EBADF} se \param{lock} non è un + puntatore valido restituisce l'errore generico \errcode{EFAULT}. 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 - \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}. + specificato nella struttura puntata da \param{lock}, ritorna un valore nullo + in caso di successo e $-1$ se il file lock è tenuto da qualcun altro, nel + qual caso si ha un errore di \errcode{EACCES} o \errcode{EAGAIN}. 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 + 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 - sez.~\ref{sec:file_posix_lock}. -\item[\const{F\_GETOWN}] restituisce il \ids{PID} del processo o - 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 \ids{PID}).} che è preposto alla ricezione - dei segnali \signal{SIGIO} (o qualunque altro segnale alternativo impostato - con \const{F\_SETSIG}) per gli eventi associati al file - descriptor \param{fd}\footnote{il segnale viene usato sia per il - \textit{Signal Drive I/O}, che tratteremo in - sez.~\ref{sec:file_asyncronous_operation}, che dai vari meccanismi di - notifica asincrona, che tratteremo in - sez.~\ref{sec:file_asyncronous_lease}.} e \signal{SIGURG} per la notifica - dei dati urgenti di un socket (vedi sez.~\ref{sec:TCP_urgent_data}). 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}.\footnote{si tenga presente però che se questo valore - è compreso nell'intervallo fra $-1$ e $-4095$ questo viene interpretato - dalla \acr{glibc} come un errore per cui in tal caso \func{fcntl} - ritornerà comunque $-1$ mentre il valore restituito dalla \textit{system - call} verrà assegnato ad \var{errno}, cambiato di segno.} In caso di - errore viene restituito $-1$. + imposta \var{errno} a \errcode{EINTR}. Questa funzionalità è trattata in + dettaglio in sez.~\ref{sec:file_posix_lock}. + +\item[\const{F\_GETOWN}] restituisce in caso di successo l'identificatore del + processo o del \itindex{process~group} \textit{process group} (vedi + sez.~\ref{sec:sess_proc_group}) che è preposto alla ricezione del segnale + \signal{SIGIO} (o l'eventuale segnale alternativo impostato con + \const{F\_SETSIG}) per gli eventi asincroni associati al file + descriptor \param{fd} e del segnale \signal{SIGURG} per la notifica dei dati + urgenti di un socket (vedi sez.~\ref{sec:TCP_urgent_data}). Restituisce $-1$ + in caso di errore ed il terzo argomento viene ignorato. Non sono previsti + errori diversi da \errval{EBADF}. + + Per distinguerlo dal caso in cui il segnale viene inviato a un singolo + processo, 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}. Con Linux questo comporta un + problema perché se il valore restitituito dalla \textit{system call} è + compreso nell'intervallo fra $-1$ e $-4095$ in alcune architetture questo + viene trattato dalla \acr{glibc} come un errore,\footnote{il problema deriva + dalle limitazioni presenti in architetture come quella dei normali PC + (i386) per via delle modalità in cui viene effettuata l'invocazione delle + \textit{system call} che non consentono di restituire un adeguato codice + di ritorno.} per cui in tal caso \func{fcntl} ritornerà comunque $-1$ + mentre il valore restituito dalla \textit{system call} verrà assegnato ad + \var{errno}, cambiato di segno. + + Per questo motivo con il kernel 2.6.32 è stato introdotto il comando + alternativo \const{F\_GETOWN\_EX}, che vedremo a breve, che consente di + evitare il problema. A partire dalla versione 2.11 la \acr{glibc}, se + disponibile, usa questa versione alternativa per mascherare il problema + precedente e restituire un valore corretto in tutti i casi.\footnote{in cui + cioè viene restituito un valore negativo corretto qualunque sia + l'identificatore del \itindex{process~group} \textit{process group}, che + non potendo avere valore unitario (non esiste infatti un + \itindex{process~group} \textit{process group} per \cmd{init}) non può + generare ambiguità con il codice di errore.} Questo però comporta che il + comportamento del comando può risultare diverso a seconda delle versioni + della \acr{glibc} e del kernel. + \item[\const{F\_SETOWN}] imposta, con il valore dell'argomento \param{arg}, l'identificatore del processo o del \itindex{process~group} \textit{process group} che riceverà i segnali \signal{SIGIO} e \signal{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 - indicare 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}. L'impostazione è soggetta alle stesse restrizioni presenti sulla - funzione \func{kill} (vedi sez.~\ref{sec:sig_kill_raise}), per cui in - sostanza un utente non privilegiato potrà cioè inviare i segnali solo ad un - processo che gli appartiene. Nel caso di \textit{thread},\footnote{in questo - caso si fa riferimento alla implementazione nativa di Linux delle NTPL, - vedi sez.~\ref{sec:linux_ntpl}. } quando si è impostato un segnale con - \const{F\_SETSIG}, un valore positivo di \param{arg} verrà interpretato come - indicante il \textit{Thread ID} che indica uno specifico \textit{thread} e - non come \textit{Process ID}, dato che in tal caso il \textit{thread} - principale mantiene un valore del \textit{Thread ID} uguale al \ids{PID}. -\item[\const{F\_GETSIG}] restituisce il valore del segnale inviato quando un - file descriptor aperto ed impostato per l'I/O asincrono (si veda - sez.~\ref{sec:file_asyncronous_io}) è pronto per le operazioni di lettura o - scrittura. Il valore 0 indica il valore predefinito, che è \signal{SIGIO}, - un valore diverso da zero indica il segnale richiesto, che può essere anche - lo stesso \signal{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 - valore zero indica di usare il segnale predefinito, \signal{SIGIO}. Un altro - valore diverso da zero, compreso lo stesso \signal{SIGIO}, specifica il - segnale voluto; l'uso di un valore diverso da zero permette inoltre, se si è + eventi associati al file descriptor \param{fd}. Ritorna un valore nullo in + caso di successo o $-1$ in caso di errore. Oltre a \errval{EBADF} gli errori + possibili sono \errcode{ESRCH} se \param{arg} indica un processo o un + \itindex{process~group} \textit{process group} inesistente. + + L'impostazione è soggetta alle stesse restrizioni presenti sulla funzione + \func{kill} (vedi sez.~\ref{sec:sig_kill_raise}), per cui un utente non + privilegiato può inviare i segnali solo ad un processo che gli appartiene, + in genere comunque si usa il processo corrente. Come per \const{F\_GETOWN}, + per indicare un \itindex{process~group} \textit{process group} si deve usare + per \param{arg} un valore negativo, il cui valore assoluto corrisponda + all'identificatore del \itindex{process~group} \textit{process group}. + + A partire dal kernel 2.6.12 se si sta operando con i \textit{thread} della + implementazione nativa di Linux (quella della NTPL, vedi + sez.~\ref{sec:linux_ntpl}) e se si è impostato un segnale specifico con + \const{F\_SETSIG}, un valore positivo di \param{arg} viene interpretato come + indicante un \textit{Thread ID} e non un \textit{Process ID}. Questo + consente di inviare il segnale impostato con \const{F\_SETSIG} ad uno + specifico \textit{thread}. In genere questo non comporta differenze + significative per il processi ordinari, in cui non esistono altri + \textit{thread}, dato che su Linux il \textit{thread} principale, che in tal + caso è anche l'unico, mantiene un valore del \textit{Thread ID} uguale al + \ids{PID} del processo. Il problema è però che questo comportamento non si + applica a \signal{SIGURG}, per il quale \param{arg} viene sempre + interpretato come l'identificatore di un processo o di un + \itindex{process~group} \textit{process group}. + +\item[\const{F\_GETOWN\_EX}] legge nella struttura puntata + dal'argomento \param{owner} l'identificatore del processo, \textit{thread} o + \itindex{process~group} \textit{process group} (vedi + sez.~\ref{sec:sess_proc_group}) che è preposto alla ricezione dei segnali + \signal{SIGIO} e \signal{SIGURG} per gli eventi associati al file + descriptor \param{fd}. Ritorna un valore nullo in caso di successo o $-1$ + in caso di errore. Oltre a \errval{EBADF} e da + \errval{EFAULT} se \param{owner} non è un puntatore valido. + + Il comando, che è disponibile solo a partire dal kernel 2.6.32, effettua lo + stesso compito di \const{F\_GETOWN} di cui costituisce una evoluzione che + consente di superare i limiti e le ambiguità relative ai valori restituiti + come identificativo. A partire dalla versione 2.11 della \acr{glibc} esso + viene usato dalla libreria per realizzare una versione di \func{fcntl} che + non presenti i problemi illustrati in precedenza per la versione precedente + di \const{F\_GETOWN}. Il comando è specifico di Linux ed utilizzabile solo + se si è definita la macro \macro{\_GNU\_SOURCE}. + +\item[\const{F\_SETOWN\_EX}] imposta con il valore della struttura + \struct{f\_owner\_ex} puntata \param{owner}, l'identificatore del processo o + del \itindex{process~group} \textit{process group} che riceverà i segnali + \signal{SIGIO} e \signal{SIGURG} per gli eventi associati al file + descriptor \param{fd}. Ritorna un valore nullo in caso di successo o $-1$ in + caso di errore, con gli stessi errori di \const{F\_SETOWN} più + \errcode{EINVAL} se il campo \var{type} di \struct{f\_owner\_ex} non indica + un tipo di identificatore valido. + + \begin{figure}[!htb] + \footnotesize \centering + \begin{varwidth}[c]{0.5\textwidth} + \includestruct{listati/f_owner_ex.h} + \end{varwidth} + \normalsize + \caption{La struttura \structd{f\_owner\_ex}.} + \label{fig:f_owner_ex} + \end{figure} + + Come \const{F\_GETOWN\_EX} il comando richiede come terzo argomento il + puntatore ad una struttura \struct{f\_owner\_ex} la cui definizione è + riportata in fig.~\ref{fig:f_owner_ex}, in cui il primo campo indica il tipo + di indentificatore il cui valore è specificato nel secondo campo, che assume + lo stesso significato di \param{arg} per \const{F\_SETOWN}. Per il campo + \var{type} i soli valori validi sono \const{F\_OWNER\_TID}, + \const{F\_OWNER\_PID} e \const{F\_OWNER\_PGRP}, che indicano rispettivamente + che si intedende specificare con \var{pid} un \textit{Tread ID}, un + \textit{Process ID} o un \textit{Process Group ID}. A differenza di + \const{F\_SETOWN} se si specifica un \textit{Tread ID} questo riceverà sia + \signal{SIGIO} (o il segnale impostato con \const{F\_SETSIG}) che + \signal{SIGURG}. Il comando è specifico di Linux, è disponibile solo a + partire dal kernel 2.6.32, ed è utilizzabile solo se si è definita la macro + \macro{\_GNU\_SOURCE}. + +\item[\const{F\_GETSIG}] restituisce il valore del segnale inviato dai vari + meccanismi di I/O asincrono associati al file descriptor \param{fd} (quelli + trattati in sez.~\ref{sec:file_asyncronous_operation}) in caso di successo o + $-1$ in caso di errore, il terzo argomento viene ignorato. Non sono previsti + errori diversi da \errval{EBADF}. Un valore nullo indica che si sta usando + il segnale predefinito, che è \signal{SIGIO}. Un valore diverso da zero + indica il segnale che è stato impostato con \const{F\_SETSIG}, che può + essere anche lo stesso \signal{SIGIO}. Il comando è specifico di Linux ed + utilizzabile solo se si è definita la macro \macro{\_GNU\_SOURCE}. + +\item[\const{F\_SETSIG}] imposta il segnale inviato dai vari meccanismi di I/O + asincrono associati al file descriptor \param{fd} (quelli trattati in + sez.~\ref{sec:file_asyncronous_operation}) al valore indicato + da \param{arg}, ritorna un valore nullo in caso di successo o $-1$ in caso + di errore. Oltre a \errval{EBADF} gli errori possibili sono + \errcode{EINVAL} se \param{arg} indica un numero di segnale non valido. Un + valore nullo di \param{arg} indica di usare il segnale predefinito, cioè + \signal{SIGIO}. Un valore diverso da zero, compreso lo stesso + \signal{SIGIO}, specifica il segnale voluto. Il comando è specifico di + Linux ed utilizzabile solo se si è definita la macro \macro{\_GNU\_SOURCE}. + + L'impostazione di un valore diverso da zero permette inoltre, se si è installato il gestore del segnale come \var{sa\_sigaction} usando \const{SA\_SIGINFO}, (vedi sez.~\ref{sec:sig_sigaction}), di rendere disponibili al gestore informazioni ulteriori riguardo il file che ha - generato il segnale attraverso i valori restituiti in \struct{siginfo\_t} - (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 e sono utilizzabili solo se si è definita la macro - \macro{\_GNU\_SOURCE}.} -\item[\const{F\_SETLEASE}] imposta o rimuove un \itindex{file~lease} - \textit{file lease} 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 è una funzionalità - specifica di Linux (vedi sez.~\ref{sec:file_asyncronous_lease}) presente 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 - cerchi di eseguire una \func{open} o una \func{truncate} su di esso. + generato il segnale attraverso i valori restituiti in + \struct{siginfo\_t}. Se inoltre si imposta un segnale \textit{real-time} si + potranno sfruttare le caratteristiche di avanzate di questi ultimi (vedi + sez.~\ref{sec:sig_real_time}), ed in particolare la capacità di essere + accumulati in una coda prima della notifica. + \item[\const{F\_GETLEASE}] restituisce il tipo di \itindex{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 \signal{SIGIO} (o altro - segnale specificato con \const{F\_SETSIG}) ogni modifica eseguita o + descriptor \var{fd} o $-1$ in caso di errore, il terzo argomento viene + ignorato. Non sono previsti errori diversi da \errval{EBADF}. Il comando è + specifico di Linux ed utilizzabile solo se si è definita la macro + \macro{\_GNU\_SOURCE}. Questa funzionalità è trattata in dettaglio in + sez.~\ref{sec:file_asyncronous_lease}. + +\item[\const{F\_SETLEASE}] imposta o rimuove a seconda del valore + di \param{arg} un \itindex{file~lease} \textit{file lease} sul file + descriptor \var{fd} a seconda del valore indicato da \param{arg}. Ritorna un + valore nullo in caso di successo o $-1$ in caso di errore. Oltre a + \errval{EBADF} si otterrà \errcode{EINVAL} se si è specificato un valore non + valido per \param{arg} (deve essere usato uno dei valori di + tab.~\ref{tab:file_lease_fctnl}), \errcode{ENOMEM} se non c'è memoria + sufficiente per creare il \textit{file lease}, \errcode{EACCESS} se non si è + il proprietario del file e non si hanno i privilegi di + amministratore.\footnote{per la precisione occorre la capacità + \itindex{capabilities} \const{CAP\_LEASE}.} + + Il comando è specifico di Linux ed utilizzabile solo se si è definita la + macro \macro{\_GNU\_SOURCE}. Il comando è presente a partire dai kernel + della serie 2.4.x, quando è stato introdotto il supporto \textit{file + lease}, per cui un processo che detiene un \textit{lease} su un file + riceve una notifica qualora un altro processo cerchi di eseguire una + \func{open} o una \func{truncate} su di esso. Questa funzionalità è trattata + in dettaglio in sez.~\ref{sec:file_asyncronous_lease}. + +\item[\const{F\_NOTIFY}] attiva il meccanismo di notifica asincrona per cui + viene riportato al processo chiamante, tramite il segnale \signal{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 - di errore. Questa funzionalità avanzata, disponibile dai kernel della serie - 2.4.x, è trattata in dettaglio in sez.~\ref{sec:file_asyncronous_lease}. + in essa contenuti; ritorna un valore nullo in caso di successo o $-1$ in + caso di errore. Il comando è specifico di Linux ed utilizzabile solo se si è + definita la macro \macro{\_GNU\_SOURCE}. Questa funzionalità, disponibile + dai kernel della serie 2.4.x, è trattata in dettaglio in + sez.~\ref{sec:file_asyncronous_lease}. + +\item[\const{F\_GETPIPE\_SZ}] + +\item[\const{F\_SETPIPE\_SZ}] + \end{basedescript} -La maggior parte delle funzionalità di \func{fcntl} sono troppo avanzate per -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_access} mentre quelle relative al -\itindex{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}. +La maggior parte delle funzionalità controllate dai comandi di \func{fcntl} +sono molto avanzate e richiedono degli approfondimenti ulteriori rispetto a +quanto illustrato adesso; 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 \itindex{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}. + +La gran parte dei comandi di \func{fcntl} (\const{F\_DUPFD}, \const{F\_GETFD}, +\const{F\_SETFD}, \const{F\_GETFL}, \const{F\_SETFL}, \const{F\_GETLK}, +\const{F\_SETLK} e \const{F\_SETLKW}) sono presenti da molto tempo, sono +previsti da SVr4 e 4.3BSD e standardizzati in POSIX.1-2001 che inoltre prevede +gli ulteriori \const{F\_GETOWN} e \const{F\_SETOWN}. Pertanto nell'elenco si +sono indicate esplicitamente soltanto le ulteriori richieste in termini delle +macro di funzionalità di sez.~\ref{sec:intro_gcc_glibc_std} soltanto per le +funzionalità inserite in standard successivi o specifiche di Linux. 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 @@ -2060,8 +2216,8 @@ bit di accesso dal \textit{file status flag}. -\subsection{La funzione \func{ioctl}} -\label{sec:file_ioctl} +% \subsection{La funzione \func{ioctl}} +% \label{sec:file_ioctl} 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 @@ -2069,8 +2225,8 @@ interfaccia che permette di interagire con essi tramite le stesse funzioni usate per i normali file di dati, esisteranno sempre caratteristiche peculiari, specifiche dell'hardware e della funzionalità che ciascun dispositivo può provvedere, che non possono venire comprese in questa -interfaccia astratta (un caso tipico è l'impostazione della velocità di una -porta seriale, o le dimensioni di un framebuffer). +interfaccia astratta come ad esempio l'impostazione della velocità di una +porta seriale, o le dimensioni di un framebuffer. Per questo motivo nell'architettura del sistema è stata prevista l'esistenza di una funzione apposita, \funcd{ioctl}, con cui poter compiere le operazioni @@ -2171,7 +2327,7 @@ operazioni che sono predefinite per qualunque file,\footnote{in particolare operazione logica, \func{ioctl} non richiede un terzo argomento, il cui eventuale valore viene ignorato. \item[\const{FIOASYNC}] abilita o disabilita la modalità di I/O asincrono sul - file (vedi sez.~\ref{sec:file_asyncronous_operation}); il terzo argomento + file (vedi sez.~\ref{sec:signal_driven_io}); il terzo argomento deve essere un puntatore ad un intero (cioè di tipo \texttt{const int *}) che contiene un valore logico (un valore nullo disabilita, un valore non nullo abilita). diff --git a/gapil.tex b/gapil.tex index d8c6ee6..a09103c 100644 --- a/gapil.tex +++ b/gapil.tex @@ -79,6 +79,7 @@ hyperfootnotes=false]{hyperref} \usepackage{boxedminipage} \usepackage{multirow} \usepackage{longtable} +\usepackage{varwidth} %\usepackage{footnote} %\usepackage{mdwtab} diff --git a/intro.tex b/intro.tex index b5f1986..1b78616 100644 --- a/intro.tex +++ b/intro.tex @@ -760,11 +760,11 @@ tratteremo in dettaglio in sez.~\ref{sec:files_std_interface}. Entrambe le interfacce possono essere usate per l'accesso ai file come agli altri oggetti del VFS, ma per poter accedere alle operazioni di controllo -(descritte in sez.~\ref{sec:file_fcntl} e sez.~\ref{sec:file_ioctl}) su un -qualunque tipo di oggetto del VFS occorre usare l'interfaccia standard di Unix -con i file descriptor. Allo stesso modo devono essere usati i file descriptor -se si vuole ricorrere a modalità speciali di I/O come il -\itindex{file~locking} \textit{file locking} o l'I/O non-bloccante (vedi +(descritte in sez.~\ref{sec:file_fcntl_ioctl}) su un qualunque tipo di oggetto +del VFS occorre usare l'interfaccia standard di Unix con i file +descriptor. Allo stesso modo devono essere usati i file descriptor se si vuole +ricorrere a modalità speciali di I/O come il \itindex{file~locking} +\textit{file locking} o l'I/O non-bloccante (vedi cap.~\ref{cha:file_advanced}). Gli \textit{stream} forniscono un'interfaccia di alto livello costruita sopra diff --git a/listati/dqblk.h b/listati/dqblk.h index d84d5b3..858e8d8 100644 --- a/listati/dqblk.h +++ b/listati/dqblk.h @@ -1,12 +1,12 @@ struct dqblk { - u_int64_t dqb_bhardlimit; /* absolute limit on disk quota blocks alloc */ - u_int64_t dqb_bsoftlimit; /* preferred limit on disk quota blocks */ - u_int64_t dqb_curspace; /* current quota block count */ - u_int64_t dqb_ihardlimit; /* maximum # allocated inodes */ - u_int64_t dqb_isoftlimit; /* preferred inode limit */ - u_int64_t dqb_curinodes; /* current # allocated inodes */ - u_int64_t dqb_btime; /* time limit for excessive disk use */ - u_int64_t dqb_itime; /* time limit for excessive files */ - u_int32_t dqb_valid; /* bitmask of QIF_* constants */ + u_int64_t dqb_bhardlimit; /* absolute limit on disk quota blocks alloc */ + u_int64_t dqb_bsoftlimit; /* preferred limit on disk quota blocks */ + u_int64_t dqb_curspace; /* current quota block count */ + u_int64_t dqb_ihardlimit; /* maximum # allocated inodes */ + u_int64_t dqb_isoftlimit; /* preferred inode limit */ + u_int64_t dqb_curinodes; /* current # allocated inodes */ + u_int64_t dqb_btime; /* time limit for excessive disk use */ + u_int64_t dqb_itime; /* time limit for excessive files */ + u_int32_t dqb_valid; /* bitmask of QIF_* constants */ }; diff --git a/prochand.tex b/prochand.tex index fa6e1d5..280ace4 100644 --- a/prochand.tex +++ b/prochand.tex @@ -607,7 +607,7 @@ comune dopo l'esecuzione di una \func{fork} è la seguente: \begin{itemize*} \item i file aperti e gli eventuali flag di \itindex{close-on-exec} \textit{close-on-exec} impostati (vedi sez.~\ref{sec:proc_exec} e - sez.~\ref{sec:file_fcntl}); + sez.~\ref{sec:file_fcntl_ioctl}); \item gli identificatori per il controllo di accesso: l'\textsl{user-ID reale}, il \textsl{group-ID reale}, l'\textsl{user-ID effettivo}, il \textsl{group-ID effettivo} ed i \textit{group-ID supplementari} (vedi @@ -1622,7 +1622,7 @@ nell'esecuzione della funzione \func{exec}, queste sono: La gestione dei file aperti nel passaggio al nuovo programma lanciato con \func{exec} dipende dal valore che ha il flag di \itindex{close-on-exec} -\textit{close-on-exec} (vedi sez.~\ref{sec:file_fcntl}) per ciascun +\textit{close-on-exec} (vedi sez.~\ref{sec:file_fcntl_ioctl}) per ciascun \textit{file descriptor}. I file per cui è impostato vengono chiusi, tutti gli altri file restano aperti. Questo significa che il comportamento predefinito è che i file restano aperti attraverso una \func{exec}, a meno di una chiamata @@ -2823,7 +2823,7 @@ rispettivamente 1 e 99. \begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{\textwidth} + \begin{minipage}[c]{0.5\textwidth} \includestruct{listati/sched_param.c} \end{minipage} \normalsize diff --git a/signal.tex b/signal.tex index 773fc4c..1a63283 100644 --- a/signal.tex +++ b/signal.tex @@ -1897,7 +1897,7 @@ altre informazioni specifiche. messaggi POSIX (vedi sez.~\ref{sec:ipc_posix_mq}).\footnotemark\\ \const{SI\_ASYNCIO}& una operazione di I/O asincrono (vedi - sez.~\ref{sec:file_asyncronous_access}) è stata + sez.~\ref{sec:file_asyncronous_io}) è stata completata.\\ \const{SI\_SIGIO} & segnale di \signal{SIGIO} da una coda (vedi sez.~\ref{sec:file_asyncronous_operation}).\\ diff --git a/sockctrl.tex b/sockctrl.tex index 8d0f5b9..7b4bad1 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -3545,11 +3545,10 @@ caratteristiche delle opzioni citate è quello dell'elenco seguente: Benché la maggior parte delle caratteristiche dei socket sia gestibile con le funzioni \func{setsockopt} e \func{getsockopt}, alcune proprietà possono essere impostate attraverso le funzioni \func{fcntl} e \func{ioctl} già -trattate in sez.~\ref{sec:file_fcntl} e sez.~\ref{sec:file_ioctl}; in -quell'occasione abbiamo parlato di queste funzioni esclusivamente nell'ambito -della loro applicazione a file descriptor associati a dei file normali; qui -tratteremo invece i dettagli del loro utilizzo con file descriptor associati a -dei socket. +trattate in sez.~\ref{sec:file_fcntl_ioctl}; in quell'occasione abbiamo +parlato di queste funzioni esclusivamente nell'ambito della loro applicazione +a file descriptor associati a dei file normali; qui tratteremo invece i +dettagli del loro utilizzo con file descriptor associati a dei socket. \subsection{L'uso di \func{ioctl} e \func{fcntl} per i socket generici} @@ -3557,10 +3556,10 @@ dei socket. Tratteremo in questa sezione le caratteristiche specifiche delle funzioni \func{ioctl} e \func{fcntl} quando esse vengono utilizzate con dei socket -generici. Quanto già detto in precedenza in sez.~\ref{sec:file_fcntl} e -sez.~\ref{sec:file_ioctl} continua a valere; quello che tratteremo qui sono le -operazioni ed i comandi che sono validi, o che hanno significati peculiari, -quando queste funzioni vengono applicate a dei socket generici. +generici. Quanto già detto in precedenza sez.~\ref{sec:file_fcntl_ioctl} +continua a valere; quello che tratteremo qui sono le operazioni ed i comandi +che sono validi, o che hanno significati peculiari, quando queste funzioni +vengono applicate a dei socket generici. Nell'elenco seguente si riportano i valori specifici che può assumere il secondo argomento della funzione \func{ioctl} (\param{request}, che indica il @@ -3600,10 +3599,10 @@ identificano le operazioni sono le seguenti: nullo. \item[\const{FIOASYNC}] Abilita o disabilita la modalità di I/O asincrono sul - socket. Questo significa (vedi sez.~\ref{sec:file_asyncronous_operation}) - che verrà inviato il segnale di \signal{SIGIO} (o quanto impostato con - \const{F\_SETSIG}, vedi sez.~\ref{sec:file_fcntl}) in caso di eventi di I/O - sul socket. + socket. Questo significa (vedi sez.~\ref{sec:signal_driven_io}) che verrà + inviato il segnale di \signal{SIGIO} (o quanto impostato con + \const{F\_SETSIG}, vedi sez.~\ref{sec:file_fcntl_ioctl}) in caso di eventi + di I/O sul socket. \end{basedescript} Nel caso dei socket generici anche \func{fcntl} prevede un paio di comandi diff --git a/tcpsock.tex b/tcpsock.tex index 4c60c0a..d4533fe 100644 --- a/tcpsock.tex +++ b/tcpsock.tex @@ -1101,8 +1101,9 @@ eventualmente ripetere la chiamata alla funzione come per l'errore di Un'altra differenza con BSD è che la funzione non fa ereditare al nuovo socket i flag del socket originale, come \const{O\_NONBLOCK},\footnote{ed in generale tutti quelli che si possono impostare con \func{fcntl}, vedi - sez.~\ref{sec:file_fcntl}.} che devono essere rispecificati ogni volta. Tutto -questo deve essere tenuto in conto se si devono scrivere programmi portabili. + sez.~\ref{sec:file_fcntl_ioctl}.} che devono essere rispecificati ogni +volta. Tutto questo deve essere tenuto in conto se si devono scrivere +programmi portabili. Il meccanismo di funzionamento di \func{accept} è essenziale per capire il funzionamento di un server: in generale infatti c'è sempre un solo socket in -- 2.30.2