X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileio.tex;h=3091504cb8af091ebc5ed9d3bcf7e1cc82337b2c;hp=a044eec8facbf96bed7ac9f2c90fa14ef4efd209;hb=de137402ded9a730854f908315767d73c5308d9d;hpb=99fa5a06cd27160cf673e3483ad552d32efa2c05 diff --git a/fileio.tex b/fileio.tex index a044eec..3091504 100644 --- a/fileio.tex +++ b/fileio.tex @@ -1,6 +1,6 @@ %% fileio.tex (merge fileunix.tex - filestd.tex) %% -%% Copyright (C) 2000-2015 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2016 Simone Piccardi. Permission is granted to %% copy, distribute and/or modify this document under the terms of the GNU Free %% Documentation License, Version 1.1 or any later version published by the %% Free Software Foundation; with the Invariant Sections being "Un preambolo", @@ -12,7 +12,7 @@ \chapter{La gestione dell'I/O su file} \label{cha:file_IO_interface} -Esamineremo in questo capitolo le due interfacce di programmazione che +Esamineremo in questo capitol le due interfacce di programmazione che consentono di gestire i dati mantenuti nei file. Cominceremo con quella nativa del sistema, detta dei \textit{file descriptor}, che viene fornita direttamente dalle \textit{system call} e che non prevede funzionalità evolute @@ -59,10 +59,10 @@ file dovrà essere chiuso, e questo chiuderà il canale di comunicazione impedendo ogni ulteriore operazione. All'interno di ogni processo i file aperti sono identificati da un numero -intero non negativo, che viene chiamato \textit{file descriptor}. Quando un -file viene aperto la funzione \func{open} restituisce questo numero, tutte le -ulteriori operazioni dovranno essere compiute specificando questo stesso -numero come argomento alle varie funzioni dell'interfaccia. +intero non negativo, che viene chiamato appunto \textit{file descriptor}. +Quando un file viene aperto la funzione \func{open} restituisce questo numero, +tutte le ulteriori operazioni dovranno essere compiute specificando questo +stesso numero come argomento alle varie funzioni dell'interfaccia. \itindbeg{process~table} \itindbeg{file~table} @@ -109,7 +109,7 @@ particolare: \centering \includegraphics[width=12cm]{img/procfile} \caption{Schema della architettura dell'accesso ai file attraverso - l'interfaccia dei \textit{file descriptor}.} + l'interfaccia dei file descriptor.} \label{fig:file_proc_file} \end{figure} @@ -133,18 +133,18 @@ essenziali come: \textit{file table}. \end{itemize*} -In questa infrastruttura un \textit{file descriptor} non è altro che l'intero -positivo che indicizza quest'ultima tabella, e che consente di recuperare il -puntatore alla struttura \kstruct{file} corrispondente al file aperto dal -processo a cui era stato assegnato questo indice. Una volta ottenuta grazie al -\textit{file descriptor} la struttura \kstruct{file} corrispondente al file -voluto nella \textit{file table}, il kernel potrà usare le funzioni messe -disposizione dal VFS per eseguire sul file tutte le operazioni necessarie. +In questa infrastruttura un file descriptor non è altro che l'intero positivo +che indicizza quest'ultima tabella, e che consente di recuperare il puntatore +alla struttura \kstruct{file} corrispondente al file aperto dal processo a cui +era stato assegnato questo indice. Una volta ottenuta grazie al file +descriptor la struttura \kstruct{file} corrispondente al file voluto nella +\textit{file table}, il kernel potrà usare le funzioni messe disposizione dal +VFS per eseguire sul file tutte le operazioni necessarie. Il meccanismo dell'apertura dei file prevede che venga sempre fornito il primo -\textit{file descriptor} libero nella tabella, e per questo motivo essi -vengono assegnati in successione tutte le volte che si apre un nuovo file, -posto che non ne sia stato chiuso nessuno in precedenza. +file descriptor libero nella tabella, e per questo motivo essi vengono +assegnati in successione tutte le volte che si apre un nuovo file, posto che +non ne sia stato chiuso nessuno in precedenza. \itindbeg{standard~input} \itindbeg{standard~output} @@ -178,12 +178,9 @@ tab.~\ref{tab:file_std_files}. \textbf{File} & \textbf{Significato} \\ \hline \hline - \const{STDIN\_FILENO} & \textit{file descriptor} dello \textit{standard - input}.\\ - \const{STDOUT\_FILENO} & \textit{file descriptor} dello \textit{standard - output}.\\ - \const{STDERR\_FILENO} & \textit{file descriptor} dello \textit{standard - error}.\\ + \constd{STDIN\_FILENO} & file descriptor dello \textit{standard input}.\\ + \constd{STDOUT\_FILENO} & file descriptor dello \textit{standard output}.\\ + \constd{STDERR\_FILENO} & file descriptor dello \textit{standard error}.\\ \hline \end{tabular} \caption{Costanti definite in \headfile{unistd.h} per i file standard.} @@ -265,9 +262,9 @@ corrispondente,\footnote{è \func{open} che alloca \kstruct{file}, la inserisce \item[\errcode{ENOTDIR}] si è specificato \const{O\_DIRECTORY} e \param{pathname} non è una directory. \item[\errcode{ENXIO}] si sono impostati \const{O\_NONBLOCK} o - \const{O\_WRONLY} ed il file è una fifo che non viene letta da nessun - processo o \param{pathname} è un file di dispositivo ma il dispositivo è - assente. + \const{O\_WRONLY} ed il file è una \textit{fifo} che non viene letta da + nessun processo o \param{pathname} è un file di dispositivo ma il + dispositivo è assente. \item[\errcode{EPERM}] si è specificato \const{O\_NOATIME} e non si è né amministratori né proprietari del file. \item[\errcode{ETXTBSY}] si è cercato di accedere in scrittura all'immagine @@ -340,9 +337,9 @@ costanti di tab.~\ref{tab:open_access_mode_flag}. \textbf{Flag} & \textbf{Significato} \\ \hline \hline - \const{O\_RDONLY} & Apre il file in sola lettura.\\ - \const{O\_WRONLY} & Apre il file in sola scrittura.\\ - \const{O\_RDWR} & Apre il file sia in lettura che in scrittura.\\ + \constd{O\_RDONLY} & Apre il file in sola lettura.\\ + \constd{O\_WRONLY} & Apre il file in sola scrittura.\\ + \constd{O\_RDWR} & Apre il file sia in lettura che in scrittura.\\ \hline \end{tabular} \caption{Le tre costanti che identificano le modalità di accesso @@ -368,11 +365,11 @@ La modalità di accesso deve sempre essere specificata quando si apre un file, il valore indicato in \param{flags} viene salvato nei \textit{file status flags}, e può essere riletto 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 +un AND aritmetico della maschera binaria \constd{O\_ACCMODE}, ma non può essere +modificato. Nella \acr{glibc} sono definite inoltre \constd{O\_READ} come +sinonimo di \const{O\_RDONLY} e \constd{O\_WRITE} come sinonimo di \const{O\_WRONLY}.\footnote{si tratta di definizioni completamente fuori - standard, attinenti, insieme a \const{O\_EXEC} che permetterebbe l'apertura + standard, attinenti, insieme a \constd{O\_EXEC} che permetterebbe l'apertura di un file per l'esecuzione, ad un non meglio precisato ``\textit{GNU system}''; pur essendo equivalenti alle definizioni classiche non è comunque il caso di utilizzarle.} @@ -399,28 +396,28 @@ sez.~\ref{sec:file_fcntl_ioctl}). \textbf{Flag} & \textbf{Significato} \\ \hline \hline - \const{O\_CREAT} & Se il file non esiste verrà creato, con le regole + \constd{O\_CREAT} & Se il file non esiste verrà creato, con le regole di titolarità del file viste in sez.~\ref{sec:file_ownership_management}. Se si imposta questo flag l'argomento \param{mode} deve essere sempre specificato.\\ - \const{O\_DIRECTORY}& Se \param{pathname} non è una directory la + \constd{O\_DIRECTORY}&Se \param{pathname} non è una directory la chiamata fallisce. Questo flag, introdotto con il kernel 2.1.126, è specifico di Linux e serve ad evitare dei possibili \itindex{Denial~of~Service~(DoS)} \textit{DoS}\footnotemark quando \func{opendir} - viene chiamata su una fifo o su un dispositivo + viene chiamata su una \textit{fifo} o su un dispositivo associato ad una unità a nastri. Non viene usato al di fuori dell'implementazione di \func{opendir}, ed è utilizzabile soltanto se si è definita la macro \macro{\_GNU\_SOURCE}.\\ - \const{O\_EXCL} & Deve essere usato in congiunzione con + \constd{O\_EXCL} & Deve essere usato in congiunzione con \const{O\_CREAT} ed in tal caso impone che il file indicato da \param{pathname} non sia già esistente (altrimenti causa il fallimento della chiamata con un errore di \errcode{EEXIST}).\\ - \const{O\_LARGEFILE}& Viene usato sui sistemi a 32 bit per richiedere + \constd{O\_LARGEFILE}&Viene usato sui sistemi a 32 bit per richiedere l'apertura di file molto grandi, la cui dimensione non è rappresentabile con la versione a 32 bit del tipo \type{off\_t}, utilizzando @@ -431,18 +428,18 @@ sez.~\ref{sec:file_fcntl_ioctl}). delle funzioni che si attiva assegnando a $64$ la macro \macro{\_FILE\_OFFSET\_BITS}, e non usare mai questo flag.\\ - \const{O\_NOCTTY} & Se \param{pathname} si riferisce ad un dispositivo + \constd{O\_NOCTTY} & Se \param{pathname} si riferisce ad un dispositivo di terminale, questo non diventerà il terminale di controllo, anche se il processo non ne ha ancora uno (si veda sez.~\ref{sec:sess_ctrl_term}).\\ - \const{O\_NOFOLLOW} & Se \param{pathname} è un collegamento simbolico + \constd{O\_NOFOLLOW}& Se \param{pathname} è un collegamento simbolico la chiamata fallisce. Questa è un'estensione BSD aggiunta in Linux a partire dal kernel 2.1.126, ed utilizzabile soltanto se si è definita la macro \macro{\_GNU\_SOURCE}.\\ - \const{O\_TRUNC} & Se usato su un file di dati aperto in scrittura, + \constd{O\_TRUNC} & Se usato su un file di dati aperto in scrittura, ne tronca la lunghezza a zero; con un terminale o - una fifo viene ignorato, negli altri casi il + una \textit{fifo} viene ignorato, negli altri casi il comportamento non è specificato.\\ \hline \end{tabular} @@ -464,8 +461,8 @@ sez.~\ref{sec:file_fcntl_ioctl}). Si è riportato in tab.~\ref{tab:open_time_flag} l'elenco dei flag delle \textsl{modalità di apertura}.\footnote{la \acr{glibc} definisce anche i due - flag \const{O\_SHLOCK}, che aprirebbe il file con uno \textit{shared lock} e - \const{O\_EXLOCK} che lo aprirebbe con un \textit{exclusive lock} (vedi + flag \constd{O\_SHLOCK}, che aprirebbe il file con uno \textit{shared lock} e + \constd{O\_EXLOCK} che lo aprirebbe con un \textit{exclusive lock} (vedi sez.~\ref{sec:file_locking}, si tratta di opzioni specifiche di BSD, che non esistono con Linux.} Uno di questi, \const{O\_EXCL}, ha senso solo se usato in combinazione a \const{O\_CREAT} quando si vuole creare un nuovo file per @@ -500,7 +497,7 @@ si tronca il file con \const{O\_TRUNC} verranno impostati soltanto il \textbf{Flag} & \textbf{Significato} \\ \hline \hline - \const{O\_APPEND} & Il file viene aperto in \textit{append mode}. La + \constd{O\_APPEND} & Il file viene aperto in \textit{append mode}. La posizione sul file (vedi sez.~\ref{sec:file_lseek}) viene sempre mantenuta sulla sua coda, per cui quanto si scrive viene sempre aggiunto al contenuto @@ -509,33 +506,33 @@ si tronca il file con \const{O\_TRUNC} verranno impostati soltanto il verificarsi \textit{race 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 + \constd{O\_ASYNC} & Apre il file per l'I/O in modalità asincrona (vedi 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 può usare solo terminali, pseudo-terminali e socket - e, a partire dal kernel 2.6, anche sulle fifo. Per + e, a partire dal kernel 2.6, anche sulle \textit{fifo}. Per un bug dell'implementazione non è opportuno usarlo in fase di apertura del file, deve invece essere attivato successivamente con \func{fcntl}.\\ - \const{O\_CLOEXEC}& Attiva la modalità di \textit{close-on-exec} (vedi - sez.~\ref{sec:proc_exec}) sul file. Il flag è - previsto dallo standard POSIX.1-2008, ed è stato - introdotto con il kernel 2.6.23 per evitare una - \textit{race condition} 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_ioctl}).\\ - \const{O\_DIRECT} & Esegue l'I/O direttamente dalla memoria in + \constd{O\_CLOEXEC}& Attiva la modalità di \textit{close-on-exec} (vedi + sez.~\ref{sec:proc_exec}) sul file. Il flag è + previsto dallo standard POSIX.1-2008, ed è stato + introdotto con il kernel 2.6.23 per evitare una + \textit{race condition} 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_ioctl}).\\ + \constd{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 kernel. Introdotto con il kernel 2.4.10 ed utilizzabile soltanto se si è definita la macro \macro{\_GNU\_SOURCE}.\\ - \const{O\_NOATIME} & Blocca l'aggiornamento dei tempi di accesso dei + \constd{O\_NOATIME}& Blocca l'aggiornamento dei tempi di accesso dei file (vedi sez.~\ref{sec:file_file_times}). Per molti filesystem questa funzionalità non è disponibile per il singolo file ma come opzione @@ -543,7 +540,7 @@ si tronca il file con \const{O\_TRUNC} verranno impostati soltanto il montaggio. Introdotto con il kernel 2.6.8 ed utilizzabile soltanto se si è definita la macro \macro{\_GNU\_SOURCE}.\\ - \const{O\_NONBLOCK}& Apre il file in \textsl{modalità non bloccante} per + \constd{O\_NONBLOCK}&Apre il file in \textsl{modalità non bloccante} per le operazioni di I/O (vedi sez.~\ref{sec:file_noblocking}). Questo significa il fallimento delle successive operazioni di @@ -552,23 +549,23 @@ si tronca il file con \const{O\_TRUNC} verranno impostati soltanto il blocco delle stesse in attesa di una successiva possibilità di esecuzione come avviene normalmente. Questa modalità ha senso solo per le - fifo, vedi sez.~\ref{sec:ipc_named_pipe}), o quando + \textit{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_fcntl_ioctl}).\\ - \const{O\_NDELAY} & In Linux è un sinonimo di \const{O\_NONBLOCK}, ma + \constd{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 errore, questo introduce un'ambiguità, dato che come vedremo in sez.~\ref{sec:file_read} il ritorno di un valore nullo da parte di \func{read} ha il significato di una \textit{end-of-file}.\\ - \const{O\_SYNC} & Apre il file per l'input/output sincrono. Ogni + \constd{O\_SYNC} & Apre il file per l'input/output sincrono. Ogni scrittura si bloccherà fino alla conferma dell'arrivo di tutti i dati e di tutti i metadati sull'hardware sottostante (in questo significato solo dal kernel 2.6.33).\\ - \const{O\_DSYNC} & Apre il file per l'input/output sincrono. Ogni + \constd{O\_DSYNC} & Apre il file per l'input/output sincrono. Ogni scrittura di dati si bloccherà fino alla conferma dell'arrivo degli stessi e della parte di metadati ad essi relativa sull'hardware sottostante (in @@ -594,7 +591,7 @@ conseguente effetto sulle caratteristiche operative che controllano (torneremo 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 +anche con la costante \constd{FASYNC}) è definito come possibile valore per \func{open}, ma per un bug dell'implementazione,\footnote{segnalato come ancora presente nella pagina di manuale almeno fino al Settembre 2011.} non solo non attiva il comportamento citato, ma se usato richiede di essere @@ -780,8 +777,8 @@ da \param{offset}, che viene sommato al riferimento dato dall'argomento \param{whence}, che deve essere indicato con una delle costanti riportate in tab.~\ref{tab:lseek_whence_values}.\footnote{per compatibilità con alcune vecchie notazioni questi valori possono essere rimpiazzati - rispettivamente con 0, 1 e 2 o con \const{L\_SET}, \const{L\_INCR} e - \const{L\_XTND}.} Si tenga presente che la chiamata a \func{lseek} non causa + rispettivamente con 0, 1 e 2 o con \constd{L\_SET}, \constd{L\_INCR} e + \constd{L\_XTND}.} Si tenga presente che la chiamata a \func{lseek} non causa nessun accesso al file, si limita a modificare la posizione corrente (cioè il campo \var{f\_pos} della struttura \kstruct{file}, vedi fig.~\ref{fig:file_proc_file}). Dato che la funzione ritorna la nuova @@ -796,23 +793,23 @@ posizione corrente nel file con \code{lseek(fd, 0, SEEK\_CUR)}. \textbf{Costante} & \textbf{Significato} \\ \hline \hline - \const{SEEK\_SET} & Si fa riferimento all'inizio del file: il valore, che + \constd{SEEK\_SET}& Si fa riferimento all'inizio del file: il valore, che deve essere positivo, di \param{offset} indica direttamente la nuova posizione corrente.\\ - \const{SEEK\_CUR} & Si fa riferimento alla posizione corrente del file: + \constd{SEEK\_CUR}& Si fa riferimento alla posizione corrente del file: ad essa viene sommato \param{offset}, che può essere negativo e positivo, per ottenere la nuova posizione corrente.\\ - \const{SEEK\_END} & Si fa riferimento alla fine del file: alle dimensioni + \constd{SEEK\_END}& Si fa riferimento alla fine del file: alle dimensioni del file viene sommato \param{offset}, che può essere negativo e positivo, per ottenere la nuova posizione corrente.\\ \hline - \const{SEEK\_DATA}& Sposta la posizione nel file sull'inizio del primo + \constd{SEEK\_DATA}&Sposta la posizione nel file sull'inizio del primo blocco di dati dopo un \textit{hole} che segue (o coincide) con la posizione indicata da \param{offset} (dal kernel 3.1).\\ - \const{SEEK\_HOLE}& Sposta la posizione sul file all'inizio del primo + \constd{SEEK\_HOLE}&Sposta la posizione sul file all'inizio del primo \textit{hole} nel file che segue o inizia con \param{offset}, oppure si porta su \param{offset} se questo è all'interno di un \textit{hole}, oppure si @@ -1215,7 +1212,7 @@ 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_ioctl}) si applicherebbe a tutti processi che condividono la voce nella \textit{file table}. Ai file però sono associati -anche altri flag, dei quali l'unico usato al momento è \const{FD\_CLOEXEC}, +anche altri flag, dei quali l'unico usato al momento è \constd{FD\_CLOEXEC}, detti \itindex{file~descriptor~flags} \textit{file descriptor flags}; questi invece sono mantenuti in \kstruct{file\_struct}, e perciò sono locali per ciascun processo e non vengono modificati dalle azioni degli altri anche in @@ -1330,7 +1327,7 @@ standard che si vuole redirigere e poi aprire direttamente con \func{open} il file vi si vuole far corrispondere, invece di duplicare un file descriptor che si è già aperto. La risposta sta nel fatto che il file che si vuole redirigere non è detto sia un file regolare, ma potrebbe essere, come accennato, anche -una fifo o un socket, oppure potrebbe essere un file associato ad un file +una \textit{fifo} o un socket, oppure potrebbe essere un file associato ad un file descriptor che si è ereditato già aperto (ad esempio attraverso un'altra \func{exec}) da un processo antenato del padre, del quale non si conosce il nome. Operando direttamente con i file descriptor \func{dup} consente di @@ -1471,7 +1468,7 @@ scarico dei dati ad intervalli di tempo fissi. Con le nuove versioni del kernel queste operazioni vengono gestite direttamente dal sistema della memoria virtuale, attraverso opportuni \textit{task} interni al kernel il cui comportamento può essere controllato attraverso il file -\sysctlfile{vm/bdflush}.\footnote{per il significato dei valori che si possono +\sysctlfiled{vm/bdflush}.\footnote{per il significato dei valori che si possono scrivere in questo file si consulti la documentazione allegata ai sorgenti del kernel nel file \file{Documentation/sysctl/vm.txt}, trattandosi di argomenti di natura sistemistica non li prenderemo in esame.} Si tenga @@ -1638,7 +1635,7 @@ corrispettive classiche, con la sola eccezione del fatto che se fra i loro argomenti si utilizza un \textit{pathname} relativo questo sarà risolto rispetto alla directory indicata da \param{dirfd}. Qualora invece si usi un \textit{pathname} assoluto \param{dirfd} verrà semplicemente ignorato. Infine -se per \param{dirfd} si usa il valore speciale \const{AT\_FDCWD}, la +se per \param{dirfd} si usa il valore speciale \constd{AT\_FDCWD}, la risoluzione sarà effettuata rispetto alla directory di lavoro corrente del processo. Si tenga presente però che questa, come le altre costanti \texttt{AT\_*}, è definita in \headfile{fcntl.h}, pertanto se la si vuole @@ -1837,18 +1834,20 @@ costanti utilizzabili per i valori di \param{flags}. \textbf{Costante} & \textbf{Significato} \\ \hline \hline - \const{AT\_SYMLINK\_NOFOLLOW}& Se impostato la funzione non esegue la - dereferenziazione dei collegamenti simbolici.\\ - \const{AT\_SYMLINK\_FOLLOW}& Se impostato la funzione esegue la - dereferenziazione dei collegamenti simbolici - (usato esplicitamente solo da \func{linkat}).\\ - \const{AT\_EACCES} & Usato solo da \func{faccessat}, richiede che - il controllo dei permessi sia fatto usando - l'\ids{UID} effettivo invece di quello - reale.\\ - \const{AT\_REMOVEDIR} & Usato solo da \func{unlinkat}, richiede che - la funzione si comporti come \func{rmdir} - invece che come \func{unlink}.\\ + \constd{AT\_SYMLINK\_NOFOLLOW}& Se impostato la funzione non esegue la + dereferenziazione dei collegamenti + simbolici.\\ + \constd{AT\_SYMLINK\_FOLLOW}& Se impostato la funzione esegue la + dereferenziazione dei collegamenti simbolici + (usato esplicitamente solo da + \func{linkat}).\\ + \constd{AT\_EACCES} & Usato solo da \func{faccessat}, richiede che + il controllo dei permessi sia fatto usando + l'\ids{UID} effettivo invece di quello + reale.\\ + \constd{AT\_REMOVEDIR} & Usato solo da \func{unlinkat}, richiede che + la funzione si comporti come \func{rmdir} + invece che come \func{unlink}.\\ \hline \end{tabular} \caption{Le costanti utilizzate per i bit dell'argomento @@ -1859,7 +1858,7 @@ costanti utilizzabili per i valori di \param{flags}. Un'ultima differenza fra le \textit{at-functions} e le funzioni tradizionali di cui sono estensione è, come accennato in sez.~\ref{sec:file_temp_file}, -quella relativa a \funcm{utimensat} che non è propriamente una corrispondente +quella relativa a \func{utimensat} che non è propriamente una corrispondente esatta di \func{utimes} e \func{lutimes}, dato che questa funzione ha una maggiore precisione nella indicazione dei tempi dei file, per i quali come per \func{futimes}, si devono usare strutture \struct{timespec} che consentono una @@ -1927,7 +1926,7 @@ 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{1.8cm}} -\item[\const{F\_DUPFD}] trova il primo file descriptor disponibile di valore +\item[\constd{F\_DUPFD}] trova il primo file descriptor disponibile di valore 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 @@ -1937,7 +1936,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito: \itindbeg{close-on-exec} -\item[\const{F\_DUPFD\_CLOEXEC}] ha lo stesso effetto di \const{F\_DUPFD}, ma +\item[\constd{F\_DUPFD\_CLOEXEC}] ha lo stesso effetto di \const{F\_DUPFD}, ma in più attiva il flag di \textit{close-on-exec} sul 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 @@ -1945,7 +1944,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito: \macro{\_POSIX\_C\_SOURCE} ad un valore adeguato secondo quanto visto in sez.~\ref{sec:intro_gcc_glibc_std}). -\item[\const{F\_GETFD}] restituisce il valore dei \textit{file descriptor +\item[\constd{F\_GETFD}] restituisce il valore dei \textit{file descriptor 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}. Al momento l'unico flag usato è quello di @@ -1954,7 +1953,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito: \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} +\item[\constd{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 @@ -1965,7 +1964,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito: \texttt{fs/fcntl.c} dei sorgenti del kernel.} \itindend{close-on-exec} -\item[\const{F\_GETFL}] ritorna il valore dei \textit{file status flags} di +\item[\constd{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 @@ -1978,7 +1977,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito: flag} con la maschera \const{O\_ACCMODE} come già accennato in sez.~\ref{sec:file_open_close}. -\item[\const{F\_SETFL}] imposta il valore dei \textit{file status flags} al +\item[\constd{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 @@ -1990,26 +1989,26 @@ il nome indicato nel precedente prototipo), è riportata di seguito: permessi di amministratore) 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 +\item[\constd{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. 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 +\item[\constd{F\_SETLK}] richiede o rilascia un file lock a seconda di quanto 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 +\item[\constd{F\_SETLKW}] identica a \const{F\_SETLK} eccetto per il fatto che la funzione non ritorna subito ma attende che il blocco sia rilasciato, se l'attesa viene interrotta da un segnale la funzione restituisce $-1$ e imposta \var{errno} a \errcode{EINTR}. Questa funzionalità è trattata in dettaglio in sez.~\ref{sec:file_posix_lock}. -\item[\const{F\_GETOWN}] restituisce in caso di successo l'identificatore del +\item[\constd{F\_GETOWN}] restituisce in caso di successo l'identificatore del processo o del \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 @@ -2045,7 +2044,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito: 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}, +\item[\constd{F\_SETOWN}] imposta, con il valore dell'argomento \param{arg}, l'identificatore del processo o del \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 @@ -2076,7 +2075,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito: interpretato come l'identificatore di un processo o di un \textit{process group}. -\item[\const{F\_GETOWN\_EX}] legge nella struttura puntata +\item[\constd{F\_GETOWN\_EX}] legge nella struttura puntata dall'argomento \param{owner} l'identificatore del processo, \textit{thread} o \textit{process group} (vedi sez.~\ref{sec:sess_proc_group}) che è preposto alla ricezione dei segnali \signal{SIGIO} e \signal{SIGURG} per gli @@ -2093,7 +2092,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito: 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 +\item[\constd{F\_SETOWN\_EX}] imposta con il valore della struttura \struct{f\_owner\_ex} puntata \param{owner}, l'identificatore del processo o del \textit{process group} che riceverà i segnali \signal{SIGIO} e \signal{SIGURG} per gli eventi associati al file @@ -2117,17 +2116,17 @@ il nome indicato nel precedente prototipo), è riportata di seguito: riportata in fig.~\ref{fig:f_owner_ex}, in cui il primo campo indica il tipo di identificatore 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 intende 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 + \var{type} i soli valori validi sono \constd{F\_OWNER\_TID}, + \constd{F\_OWNER\_PID} e \constd{F\_OWNER\_PGRP}, che indicano + rispettivamente che si intende 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 +\item[\constd{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 @@ -2137,8 +2136,8 @@ il nome indicato nel precedente prototipo), è riportata di seguito: 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 +\item[\constd{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 @@ -2158,14 +2157,14 @@ il nome indicato nel precedente prototipo), è riportata di seguito: 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 \textit{file lease} che il +\item[\constd{F\_GETLEASE}] restituisce il tipo di \textit{file lease} che il processo detiene nei confronti del file descriptor \var{fd} o $-1$ in caso di errore, 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 +\item[\constd{F\_SETLEASE}] imposta o rimuove a seconda del valore di \param{arg} un \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à @@ -2184,7 +2183,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito: definita la macro \macro{\_GNU\_SOURCE}. Questa funzionalità è trattata in dettaglio in sez.~\ref{sec:file_asyncronous_lease}. -\item[\const{F\_NOTIFY}] attiva il meccanismo di notifica asincrona per cui +\item[\constd{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 @@ -2194,7 +2193,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito: dai kernel della serie 2.4.x, è trattata in dettaglio in sez.~\ref{sec:file_asyncronous_lease}. -\item[\const{F\_GETPIPE\_SZ}] restituisce in caso di successo la dimensione +\item[\constd{F\_GETPIPE\_SZ}] restituisce in caso di successo la dimensione del buffer associato alla \textit{pipe} \param{fd} (vedi sez.~\ref{sec:ipc_pipes}) o $-1$ in caso di errore, il terzo argomento viene ignorato. Non sono previsti errori diversi da \errval{EBADF}, che viene @@ -2202,7 +2201,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito: specifico di Linux, è disponibile solo a partire dal kernel 2.6.35, ed è utilizzabile solo se si è definita la macro \macro{\_GNU\_SOURCE}. -\item[\const{F\_SETPIPE\_SZ}] imposta la dimensione del buffer associato alla +\item[\constd{F\_SETPIPE\_SZ}] imposta la dimensione del buffer associato alla \textit{pipe} \param{fd} (vedi sez.~\ref{sec:ipc_unix}) ad un valore uguale o superiore a quello indicato dall'argomento \param{arg}. Ritorna un valore nullo in caso di successo o $-1$ in caso di errore. Oltre a \errval{EBADF} @@ -2217,7 +2216,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito: \const{F\_GETPIPE\_SZ}. I processi non privilegiati\footnote{per la precisione occorre la capacità \const{CAP\_SYS\_RESOURCE}.} non possono impostare un valore valore superiore a quello indicato da - \sysctlfile{fs/pipe-size-max}. Il comando è specifico di Linux, è + \sysctlfiled{fs/pipe-size-max}. Il comando è specifico di Linux, è disponibile solo a partire dal kernel 2.6.35, ed è utilizzabile solo se si è definita la macro \macro{\_GNU\_SOURCE}. @@ -2342,36 +2341,36 @@ sono definite nel kernel a livello generale, e vengono sempre interpretate per prime, per cui, come illustrato in \cite{LinDevDri}, eventuali operazioni specifiche che usino lo stesso valore verrebbero ignorate: \begin{basedescript}{\desclabelwidth{2.0cm}} -\item[\const{FIOCLEX}] imposta il flag di \textit{close-on-exec} sul file, in +\item[\constd{FIOCLEX}] imposta il flag di \textit{close-on-exec} sul file, in questo caso, essendo usata come operazione logica, \func{ioctl} non richiede un terzo argomento, il cui eventuale valore viene ignorato. -\item[\const{FIONCLEX}] cancella il flag di \textit{close-on-exec} sul file, +\item[\constd{FIONCLEX}] cancella il flag di \textit{close-on-exec} sul file, in questo caso, essendo usata come 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 +\item[\constd{FIOASYNC}] abilita o disabilita la modalità di I/O asincrono sul 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). -\item[\const{FIONBIO}] abilita o disabilita sul file l'I/O in modalità non +\item[\constd{FIONBIO}] abilita o disabilita sul file l'I/O in modalità non bloccante; 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). -\item[\const{FIOSETOWN}] imposta il processo che riceverà i segnali +\item[\constd{FIOSETOWN}] imposta il processo che riceverà i segnali \signal{SIGURG} e \signal{SIGIO} generati sul file; il terzo argomento deve essere un puntatore ad un intero (cioè di tipo \texttt{const int *}) il cui valore specifica il PID del processo. -\item[\const{FIOGETOWN}] legge il processo che riceverà i segnali +\item[\constd{FIOGETOWN}] legge il processo che riceverà i segnali \signal{SIGURG} e \signal{SIGIO} generati sul file; il terzo argomento deve essere un puntatore ad un intero (cioè di tipo \texttt{int *}) su cui sarà scritto il PID del processo. -\item[\const{FIONREAD}] legge il numero di byte disponibili in lettura sul +\item[\constd{FIONREAD}] legge il numero di byte disponibili in lettura sul file descriptor; questa operazione è disponibile solo su alcuni file descriptor, in particolare sui socket (vedi sez.~\ref{sec:sock_ioctl_IP}) o sui file descriptor di \textit{epoll} (vedi sez.~\ref{sec:file_epoll}), il terzo argomento deve essere un puntatore ad un intero (cioè di tipo \texttt{int *}) su cui sarà restituito il valore. -\item[\const{FIOQSIZE}] restituisce la dimensione corrente di un file o di una +\item[\constd{FIOQSIZE}] restituisce la dimensione corrente di un file o di una directory, mentre se applicata ad un dispositivo fallisce con un errore di \errcode{ENOTTY}; il terzo argomento deve essere un puntatore ad un intero (cioè di tipo \texttt{int *}) su cui sarà restituito il valore. @@ -2460,7 +2459,7 @@ concorrente ed in sez.~\ref{sec:file_access_control} per il controllo di accesso. Per ragioni storiche la struttura di dati che rappresenta uno \textit{stream} -è stata chiamata \type{FILE}, questi oggetti sono creati dalle funzioni di +è stata chiamata \typed{FILE}, questi oggetti sono creati dalle funzioni di libreria e contengono tutte le informazioni necessarie a gestire le operazioni sugli \textit{stream}, come la posizione corrente, lo stato del buffer e degli indicatori di stato e di fine del file. @@ -2630,7 +2629,7 @@ esso viene preventivamente chiuso e tutti i dati pendenti vengono scaricati. Infine \func{fdopen} viene usata per associare uno \textit{stream} ad un file descriptor esistente ottenuto tramite una altra funzione (ad esempio con una \func{open}, una \func{dup}, o una \func{pipe}) e serve quando si vogliono -usare gli \textit{stream} con file come le fifo o i socket, che non possono +usare gli \textit{stream} con file come le \textit{fifo} o i socket, che non possono essere aperti con le funzioni delle librerie standard del C. \begin{table}[htb] @@ -2871,9 +2870,9 @@ all'interno di un file per effettuare operazioni di lettura o scrittura in un punto prestabilito, sempre che l'operazione di riposizionamento sia supportata dal file sottostante lo \textit{stream}, nel caso cioè in cui si ha a che fare con quello che viene detto un file ad \textsl{accesso casuale}. Dato che in un -sistema Unix esistono vari tipi di file, come le fifo ed i file di dispositivo -(ad esempio i terminali), non è scontato che questo sia vero in generale, pur -essendolo sempre nel caso di file di dati. +sistema Unix esistono vari tipi di file, come le \textit{fifo} ed i file di +dispositivo (ad esempio i terminali), non è scontato che questo sia vero in +generale, pur essendolo sempre nel caso di file di dati. Con Linux ed in generale in ogni sistema unix-like la posizione nel file, come abbiamo già visto in sez.~\ref{sec:file_lseek}, è espressa da un intero @@ -2938,7 +2937,7 @@ intero di tipo \ctyp{long}. Dato che in certi casi, ad esempio quando si usa un filesystem indicizzato a 64 bit su una macchina con architettura a 32 bit, questo può non essere possibile lo standard POSIX ha introdotto le nuove funzioni \funcd{fgetpos} e \funcd{fsetpos}, che invece usano il nuovo tipo -\type{fpos\_t}, ed i cui prototipi sono: +\typed{fpos\_t}, ed i cui prototipi sono: \begin{funcproto}{ \fhead{stdio.h} @@ -3270,14 +3269,16 @@ che vedremo in sez.~\ref{sec:file_formatted_io} come ``\verb|\n|'' con uno zero, mentre \func{fgets} aggiunge uno zero dopo il \textit{newline}, che resta dentro la stringa. +\itindbeg{buffer~overflow} + Se la lettura incontra la fine del file (o c'è un errore) viene restituito un puntatore \val{NULL}, ed il buffer \param{buf} non viene toccato. L'uso di \func{gets} è deprecato e deve essere assolutamente evitato, la funzione infatti non controlla il numero di byte letti, per cui nel caso la stringa -letta superi le dimensioni del buffer, si avrà un \itindex{buffer~overflow} -\textit{buffer overflow}, con sovrascrittura della memoria del processo -adiacente al buffer.\footnote{questa tecnica è spiegata in dettaglio e con - molta efficacia nell'ormai famoso articolo di Aleph1 \cite{StS}.} +letta superi le dimensioni del buffer, si avrà un \textit{buffer overflow}, +con sovrascrittura della memoria del processo adiacente al +buffer.\footnote{questa tecnica è spiegata in dettaglio e con molta efficacia + nell'ormai famoso articolo di Aleph1 \cite{StS}.} Questa è una delle vulnerabilità più sfruttate per guadagnare accessi non autorizzati al sistema (i cosiddetti \textit{exploit}), basta infatti inviare @@ -3288,6 +3289,8 @@ l'esecuzione nel codice inviato nella stringa stessa, che in genere contiene uno \textit{shell code}, cioè una sezione di programma che lancia una shell da cui si potranno poi eseguire altri programmi. +\itindend{buffer~overflow} + La funzione \func{fgets} non ha i precedenti problemi di \func{gets} in quanto prende in ingresso la dimensione del buffer \param{size}, che non verrà mai ecceduta in lettura. La funzione legge fino ad un massimo di \param{size} @@ -3922,9 +3925,9 @@ in \param{buf} e la dimensione in \param{size}. \textbf{Valore} & \textbf{Modalità} \\ \hline \hline - \const{\_IONBF} & \textit{unbuffered}\\ - \const{\_IOLBF} & \textit{line buffered}\\ - \const{\_IOFBF} & \textit{fully buffered}\\ + \constd{\_IONBF} & \textit{unbuffered}\\ + \constd{\_IOLBF} & \textit{line buffered}\\ + \constd{\_IOFBF} & \textit{fully buffered}\\ \hline \end{tabular} \caption{Valori dell'argomento \param{mode} di \func{setvbuf} @@ -3937,7 +3940,7 @@ stato allocato e rimanere disponibile per tutto il tempo in cui si opera sullo \textit{stream}. In genere conviene allocarlo con \func{malloc} e disallocarlo dopo la chiusura del file; ma fintanto che il file è usato all'interno di una funzione, può anche essere usata una variabile automatica. In -\headfile{stdio.h} è definita la macro \const{BUFSIZ}, che indica le +\headfile{stdio.h} è definita la costante \constd{BUFSIZ}, che indica le dimensioni generiche del buffer di uno \textit{stream}, queste vengono usate dalla funzione \func{setbuf}. Non è detto però che tale dimensione corrisponda sempre al valore ottimale (che può variare a seconda del @@ -4069,7 +4072,6 @@ compresi gli eventuali caratteri rimandati indietro con \func{ungetc}. \subsection{Gli \textit{stream} e i \textit{thread}} \label{sec:file_stream_thread} -\itindbeg{thread} Gli \textit{stream} possono essere usati in applicazioni \textit{multi-thread} allo stesso modo in cui sono usati nelle applicazioni normali, ma si deve @@ -4169,14 +4171,14 @@ assumere uno dei valori indicati in tab.~\ref{tab:file_fsetlocking_type}. \textbf{Valore} & \textbf{Significato} \\ \hline \hline - \const{FSETLOCKING\_INTERNAL}& Lo \textit{stream} userà da ora in poi il - blocco implicito predefinito.\\ - \const{FSETLOCKING\_BYCALLER}& Al ritorno della funzione sarà l'utente a - dover gestire da solo il locking dello - \textit{stream}.\\ - \const{FSETLOCKING\_QUERY} & Restituisce lo stato corrente della - modalità di blocco dello - \textit{stream}.\\ + \constd{FSETLOCKING\_INTERNAL}& Lo \textit{stream} userà da ora in poi il + blocco implicito predefinito.\\ + \constd{FSETLOCKING\_BYCALLER}& Al ritorno della funzione sarà l'utente a + dover gestire da solo il locking dello + \textit{stream}.\\ + \constd{FSETLOCKING\_QUERY} & Restituisce lo stato corrente della + modalità di blocco dello + \textit{stream}.\\ \hline \end{tabular} \caption{Valori dell'argomento \param{type} di \func{\_\_fsetlocking} @@ -4191,8 +4193,6 @@ con uno dei valori \const{FSETLOCKING\_INTERNAL} o % TODO trattare \func{clearerr\_unlocked} -\itindend{thread} - %%% Local Variables: