Unificata sezione di fcntl e ioctl, reindicizzazione e nuovo materiale
authorSimone Piccardi <piccardi@gnulinux.it>
Sat, 18 Feb 2012 22:22:59 +0000 (22:22 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Sat, 18 Feb 2012 22:22:59 +0000 (22:22 +0000)
sui comandi di fcntl.

fileadv.tex
filedir.tex
fileio.tex
gapil.tex
intro.tex
listati/dqblk.h
prochand.tex
signal.tex
sockctrl.tex
tcpsock.tex

index a4ca6e28ae80d4cd30656cb521cd36fa588be2c8..9d43dd4b98fa764d0542ee17bee639a22650e942 100644 (file)
@@ -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.
index 7720071700509a6dbbfd5891866c6e83e194e2c8..23430d46b8d4772875915efafa46a9d8465eb1bd 100644 (file)
@@ -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 
index 7859510a1cd41c39d53b5ed680aeea31254c7227..03905c640637a631c3fc035e87d59bae5d57adde 100644 (file)
@@ -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).
index d8c6ee6b455bec3cf1e1ae84fbd26b72b0730bd4..a09103c4a31ddd05f6d862e4548094f56bda27df 100644 (file)
--- 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} 
 
index b5f1986792a67f687077f8d9c71b51208a32cb92..1b78616c0ae8ce6cbb3401ca958b2605be4e4a89 100644 (file)
--- 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
index d84d5b3934de912312add83ea87c048549f5231d..858e8d8522c9fb0950c579f9c3e0b6c7d1f717e2 100644 (file)
@@ -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 */
   };
index fa6e1d50969b63087422d86a5b12a7a3865e21e7..280ace4f26751e210cc0992353709a318ef03b1f 100644 (file)
@@ -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 
index 773fc4c88535e3e4131cef6b9abe9134f123ebb5..1a632833b87d14dbdda2b84198542c22c379511d 100644 (file)
@@ -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}).\\ 
index 8d0f5b9b34a95f1d20ffba6ed23ce2b331357fea..7b4bad10511068c2b8d88e70f70c2ff34229e86e 100644 (file)
@@ -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
index 4c60c0a7fe5e6b97299063780373ced4e606a378..d4533fe0bad22fe803df9b99518d1ead61b2cf26 100644 (file)
@@ -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