Correzioni e reindicizzazionei
authorSimone Piccardi <piccardi@gnulinux.it>
Fri, 24 Feb 2012 09:35:29 +0000 (09:35 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Fri, 24 Feb 2012 09:35:29 +0000 (09:35 +0000)
fileio.tex

index 25a8c5e30afcc677f4d6cb1f8fde359e6b5f381a..9eacc55fcf7faa41d78ecb1ad5d39b63a97c1baf 100644 (file)
@@ -171,10 +171,12 @@ 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{STDIN\_FILENO}  & \textit{file descriptor} dello
+                             \itindex{standard~input} \textit{standard
+                               input}.\\ 
+    \const{STDOUT\_FILENO} & \textit{file descriptor} dello
+                             \itindex{standard~output} \textit{standard
+                               output}.\\
     \const{STDERR\_FILENO} & \textit{file descriptor} dello \textit{standard
       error}\\
     \hline
@@ -2354,12 +2356,11 @@ specifiche che usino lo stesso valore verrebbero ignorate:
   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
-  file descriptor;\footnote{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.
+  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
   directory, mentre se applicata ad un dispositivo fallisce con un errore di
   \errcode{ENOTTY}; il terzo argomento deve essere un puntatore ad un intero
@@ -2398,10 +2399,10 @@ direttamente alle \textit{system call} messe a disposizione dal kernel.
 
 Questa interfaccia però non provvede le funzionalità previste dallo standard
 ANSI C, che invece sono realizzate attraverso opportune funzioni di libreria,
-queste, insieme alle altre funzioni definite dallo standard, vengono a
-costituire il nucleo\footnote{queste funzioni sono state implementate la prima
-  volta da Ritchie nel 1976 e da allora sono rimaste sostanzialmente
-  immutate.} delle \acr{glibc}.
+queste, insieme alle altre funzioni definite dallo standard (queste funzioni
+sono state implementate la prima volta da Ritchie nel 1976 e da allora sono
+rimaste sostanzialmente immutate), vengono a costituire il nucleo delle
+\acr{glibc}.
 
 
 Esamineremo in questa sezione le funzioni base dell'interfaccia degli
@@ -2473,14 +2474,14 @@ rappresentano i canali standard di input/output prestabiliti; anche questi tre
 nell'header \headfile{stdio.h} che sono:
 
 \begin{basedescript}{\desclabelwidth{3.0cm}}
-\item[\var{FILE *stdin}] Lo \textit{standard input} cioè il \textit{file
-    stream} da cui il processo riceve ordinariamente i dati in
-  ingresso. Normalmente è associato dalla shell all'input del terminale e
+\item[\var{FILE *stdin}] Lo \itindex{standard~input} \textit{standard input}
+  cioè il \textit{file stream} da cui il processo riceve ordinariamente i dati
+  in ingresso. Normalmente è associato dalla shell all'input del terminale e
   prende i caratteri dalla tastiera.
-\item[\var{FILE *stdout}] Lo \textit{standard output} cioè il \textit{file
-    stream} su cui il processo invia ordinariamente i dati in
-  uscita. Normalmente è associato dalla shell all'output del terminale e
-  scrive sullo schermo.
+\item[\var{FILE *stdout}] Lo \itindex{standard~output} \textit{standard
+    output} cioè il \textit{file stream} su cui il processo invia
+  ordinariamente i dati in uscita. Normalmente è associato dalla shell
+  all'output del terminale e scrive sullo schermo.
 \item[\var{FILE *stderr}] Lo \textit{standard error} cioè il \textit{file
     stream} su cui il processo è supposto inviare i messaggi di
   errore. Normalmente anch'esso è associato dalla shell all'output del
@@ -2507,13 +2508,13 @@ ma costituisce anche uno degli aspetti più comunemente fraintesi, in
 particolare per quello che riguarda l'aspetto della scrittura dei dati sul
 file.
 
-I caratteri che vengono scritti su di uno \textit{stream} normalmente vengono
-accumulati in un buffer e poi trasmessi in blocco\footnote{questa operazione
-  viene usualmente chiamata \textsl{scaricamento} dei dati, dal termine
-  inglese \textit{flush}.} tutte le volte che il buffer viene riempito, in
-maniera asincrona rispetto alla scrittura. Un comportamento analogo avviene
-anche in lettura (cioè dal file viene letto un blocco di dati, anche se ne
-sono richiesti una quantità inferiore), ma la cosa ovviamente ha rilevanza
+I dati che vengono scritti su di uno \textit{stream} normalmente vengono
+accumulati in un buffer e poi trasmessi in blocco, con l'operazione che viene
+usualmente chiamata \textsl{scaricamento}, (dal termine inglese
+\textit{flush}) tutte le volte che il buffer viene riempito, in maniera
+asincrona rispetto alla scrittura. Un comportamento analogo avviene anche in
+lettura (cioè dal file viene letto un blocco di dati, anche se ne sono
+richiesti una quantità inferiore), ma la cosa ovviamente ha rilevanza
 inferiore, dato che i dati letti sono sempre gli stessi. In caso di scrittura
 invece, quando si ha un accesso contemporaneo allo stesso file (ad esempio da
 parte di un altro processo) si potranno vedere solo le parti effettivamente
@@ -2533,30 +2534,32 @@ dispositivi interattivi:
 \begin{itemize}
 \item \textit{unbuffered}: in questo caso non c'è bufferizzazione ed i
   caratteri vengono trasmessi direttamente al file non appena possibile
-  (effettuando immediatamente una \func{write}).
+  (effettuando immediatamente una \func{write});
 \item \textit{line buffered}: in questo caso i caratteri vengono
   normalmente trasmessi al file in blocco ogni volta che viene
   incontrato un carattere di \textit{newline} (il carattere ASCII
-  \verb|\n|).
+  \verb|\n|);
 \item \textit{fully buffered}: in questo caso i caratteri vengono
   trasmessi da e verso il file in blocchi di dimensione opportuna.
 \end{itemize}
 
-Lo standard ANSI C specifica inoltre che lo standard output e lo
-standard input siano aperti in modalità \textit{fully buffered} quando
-non fanno riferimento ad un dispositivo interattivo, e che lo standard
-error non sia mai aperto in modalità \textit{fully buffered}.
+Lo standard ANSI C specifica inoltre che lo \itindex{standard~output}
+\textit{standard output} e lo \itindex{standard~input} \textit{standard input}
+siano aperti in modalità \textit{fully buffered} quando non fanno riferimento
+ad un dispositivo interattivo, e che lo standard error non sia mai aperto in
+modalità \textit{fully buffered}.
 
 Linux, come BSD e SVr4, specifica il comportamento predefinito in maniera
 ancora più precisa, e cioè impone che lo standard error sia sempre
 \textit{unbuffered} (in modo che i messaggi di errore siano mostrati il più
-rapidamente possibile) e che standard input e standard output siano aperti in
-modalità \textit{line buffered} quando sono associati ad un terminale (od
-altro dispositivo interattivo) ed in modalità \textit{fully buffered}
-altrimenti.
-
-Il comportamento specificato per standard input e standard output vale anche
-per tutti i nuovi \textit{stream} aperti da un processo; la selezione comunque
+rapidamente possibile) e che \itindex{standard~input} \textit{standard input}
+e \itindex{standard~output} \textit{standard output} siano aperti in modalità
+\textit{line buffered} quando sono associati ad un terminale (od altro
+dispositivo interattivo) ed in modalità \textit{fully buffered} altrimenti.
+
+Il comportamento specificato per \itindex{standard~input} \textit{standard
+  input} e \itindex{standard~output} \textit{standard output} vale anche per
+tutti i nuovi \textit{stream} aperti da un processo; la selezione comunque
 avviene automaticamente, e la libreria apre lo \textit{stream} nella modalità
 più opportuna a seconda del file o del dispositivo scelto.
 
@@ -2969,7 +2972,7 @@ rispettivi prototipi sono:
 \fdecl{int fgetc(FILE *stream)}
 \fdesc{Leggono un singolo byte da uno \textit{stream}.} 
 \fdecl{int getchar(void)}
-\fdesc{Legge un byte dallo \textit{standard input}.} 
+\fdesc{Legge un byte dallo \itindex{standard~input} \textit{standard input}.} 
 }
 
 {Le funzioni ritornano il byte letto in caso di successo e \val{EOF} per un
@@ -3015,7 +3018,8 @@ carattere in formato esteso (cioè di tipo \ctyp{wint\_t}), il loro prototipo
 \fdecl{wint\_t fgetwc(FILE *stream)}
 \fdesc{Leggono un carattere da uno \textit{stream}.} 
 \fdecl{wint\_t getwchar(void)}
-\fdesc{Legge un carattere dallo \textit{standard input}.} 
+\fdesc{Legge un carattere dallo \itindex{standard~input} \textit{standard
+    input}.} 
 }
 
 {Le funzioni ritornano il carattere letto in caso di successo e \val{WEOF} per
@@ -3038,7 +3042,8 @@ loro prototipi sono:
 \fdecl{int fputc(int c, FILE *stream)}
 \fdesc{Scrive un byte su uno \textit{stream}.}
 \fdecl{int putchar(int c)}
-\fdesc{Scrive un byte sullo \textit{standard output}.}
+\fdesc{Scrive un byte sullo  \itindex{standard~output} \textit{standard
+    output}.}
 }
 
 {Le funzioni ritornano il valore del byte scritto in caso di successo e
@@ -3146,7 +3151,8 @@ prototipi sono:
 \begin{funcproto}{
 \fhead{stdio.h}
 \fdecl{char *gets(char *string)}
-\fdesc{Legge una linea di testo dallo \textit{standard input}.} 
+\fdesc{Legge una linea di testo dallo \itindex{standard~input}
+  \textit{standard input}.}
 \fdecl{char *fgets(char *string, int size, FILE *stream)}
 \fdesc{Legge una linea di testo da uno \textit{stream}.} 
 }
@@ -3156,19 +3162,19 @@ prototipi sono:
 \end{funcproto}
 
 Entrambe le funzioni effettuano la lettura (dal file specificato \func{fgets},
-dallo standard input \func{gets}) di una linea di caratteri (terminata dal
-carattere \textit{newline}, \verb|'\n'|, quello mappato sul tasto di ritorno a
-capo della tastiera), ma \func{gets} sostituisce \verb|'\n'| con uno zero,
-mentre \func{fgets} aggiunge uno zero dopo il \textit{newline}, che resta
-dentro la stringa. Se la lettura incontra la fine del file (o c'è un errore)
-viene restituito un \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}.}
+dallo \itindex{standard~input} \textit{standard input} \func{gets}) di una
+linea di caratteri (terminata dal carattere \textit{newline}, \verb|'\n'|,
+quello mappato sul tasto di ritorno a capo della tastiera), ma \func{gets}
+sostituisce \verb|'\n'| con uno zero, mentre \func{fgets} aggiunge uno zero
+dopo il \textit{newline}, che resta dentro la stringa. Se la lettura incontra
+la fine del file (o c'è un errore) viene restituito un \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}.}
 
 Questa è una delle vulnerabilità più sfruttate per guadagnare accessi non
 autorizzati al sistema (i cosiddetti \textit{exploit}), basta infatti inviare
@@ -3195,7 +3201,8 @@ rispettivi prototipi sono:
 \begin{funcproto}{
 \fhead{stdio.h}
 \fdecl{int puts(char *string)}
-\fdesc{Scrive una linea di testo sullo \textit{standard output}.}
+\fdesc{Scrive una linea di testo sullo  \itindex{standard~output}
+  \textit{standard output}.}
 \fdecl{int fputs(char *string, int size, FILE *stream)}
 \fdesc{Scrive una linea di testo su uno \textit{stream}.} 
 }
@@ -3205,12 +3212,12 @@ rispettivi prototipi sono:
 \end{funcproto}
 
 La funzione \func{puts} scrive una linea di testo mantenuta
-all'indirizzo \param{string} sullo \textit{standard output} mentre \func{puts}
-la scrive sul file indicato da \param{stream}.
+all'indirizzo \param{string} sullo \itindex{standard~output} \textit{standard
+  output} mentre \func{puts} la scrive sul file indicato da \param{stream}.
 
 Dato che in questo caso si scrivono i dati in uscita \func{puts} non ha i
 problemi di \func{gets} ed è in genere la forma più immediata per scrivere
-messaggi sullo standard output; la funzione prende una stringa terminata da
+messaggi sullo  \itindex{standard~output}  standard output; la funzione prende una stringa terminata da
 uno zero ed aggiunge automaticamente il ritorno a capo. La differenza con
 \func{fputs} (a parte la possibilità di specificare un file diverso da
 \var{stdout}) è che quest'ultima non aggiunge il newline, che deve essere
@@ -3353,7 +3360,8 @@ L'output formattato viene eseguito con una delle 13 funzioni della famiglia
 \begin{funcproto}{
 \fhead{stdio.h} 
 \fdecl{int printf(const char *format, ...)}
-\fdesc{Scrive una stringa formattata sullo \textit{standard output}.} 
+\fdesc{Scrive una stringa formattata sullo \itindex{standard~output}
+  \textit{standard output}.}
 \fdecl{int fprintf(FILE *stream, const char *format, ...)}
 \fdesc{Scrive una stringa formattata su uno \textit{stream}.} 
 \fdecl{int sprintf(char *str, const char *format, ...)} 
@@ -3369,14 +3377,14 @@ Le funzioni usano la stringa \param{format} come indicatore del formato con
 cui dovrà essere scritto il contenuto degli argomenti, il cui numero
 \index{funzioni!variadic} è variabile e dipende dal formato stesso.
 
-Le prime due servono per scrivere su file (lo \textit{standard output} o
-quello specificato) la terza permette di scrivere su una stringa, in genere
-l'uso di \func{sprintf} è sconsigliato in quanto è possibile, se non si ha la
-sicurezza assoluta sulle dimensioni del risultato della stampa, eccedere le
-dimensioni di \param{str}, con conseguente sovrascrittura di altre variabili e
-possibili \itindex{buffer~overflow} \textit{buffer overflow}; per questo
-motivo si consiglia l'uso dell'alternativa \funcd{snprintf}, il cui prototipo
-è:
+Le prime due servono per scrivere su file (lo \itindex{standard~output}
+\textit{standard output} o quello specificato) la terza permette di scrivere
+su una stringa, in genere l'uso di \func{sprintf} è sconsigliato in quanto è
+possibile, se non si ha la sicurezza assoluta sulle dimensioni del risultato
+della stampa, eccedere le dimensioni di \param{str}, con conseguente
+sovrascrittura di altre variabili e possibili \itindex{buffer~overflow}
+\textit{buffer overflow}; per questo motivo si consiglia l'uso
+dell'alternativa \funcd{snprintf}, il cui prototipo è:
 
 \begin{funcproto}{
 \fhead{stdio.h}
@@ -3538,7 +3546,8 @@ sez.~\ref{sec:proc_variadic}), sono \funcd{vprintf}, \funcd{vfprintf} e
 \begin{funcproto}{
 \fhead{stdio.h}
 \fdecl{int vprintf(const char *format, va\_list ap)}
-\fdesc{Scrive una stringa formattata sullo \textit{standard output}.}
+\fdesc{Scrive una stringa formattata sullo \itindex{standard~output}
+  \textit{standard output}.} 
 \fdecl{int vfprintf(FILE *stream, const char *format, va\_list ap)}
 \fdesc{Scrive una stringa formattata su un \textit{stream}.}
 \fdecl{int vsprintf(char *str, const char *format, va\_list ap)}
@@ -3620,7 +3629,8 @@ famiglia \func{scanf}; fra queste le tre più importanti sono \funcd{scanf},
 \begin{funcproto}{
 \fhead{stdio.h}
 \fdecl{int scanf(const char *format, ...)}
-\fdesc{Esegue la scansione di dati dallo \textit{standard input}.} 
+\fdesc{Esegue la scansione di dati dallo \itindex{standard~input}
+  \textit{standard input}.}
 \fdecl{int fscanf(FILE *stream, const char *format, ...)}
 \fdesc{Esegue la scansione di dati da uno \textit{stream}. } 
 \fdecl{int sscanf(char *str, const char *format, ...)}