X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileunix.tex;h=0e2658ee7807e203e26f4a9a056fed7f8a5461cb;hp=d43019977c905f3e4a6816a6e96c79e5df91f245;hb=e99034c22f44153d9260bd9075319a3804ab91a9;hpb=247c7ba624f39b283f9e85816c0616348f39c1b6 diff --git a/fileunix.tex b/fileunix.tex index d430199..0e2658e 100644 --- a/fileunix.tex +++ b/fileunix.tex @@ -138,10 +138,11 @@ posto di questi valori numerici: \label{tab:file_std_files} \end{table} -In \curfig\ si è utilizzata questa situazione come esempio, facendo -riferimento ad un programma in cui lo \textit{standard input} è associato ad -un file mentre lo \textit{standard output} e lo \textit{standard error} sono -entrambi associati ad un altro file (e quindi utilizzano lo stesso inode). +In \figref{tab:file_std_files} si è utilizzata questa situazione come esempio, +facendo riferimento ad un programma in cui lo \textit{standard input} è +associato ad un file mentre lo \textit{standard output} e lo \textit{standard + error} sono entrambi associati ad un altro file (e quindi utilizzano lo +stesso inode). Nelle vecchie versioni di Unix (ed anche in Linux fino al kernel 2.0.x) il numero di file aperti era anche soggetto ad un limite massimo dato dalle @@ -183,8 +184,8 @@ prototipo specificati da \var{mode}. \bodydesc{La funzione ritorna il file descriptor in caso di successo e -1 in - caso di errore. In questo caso la variabile \var{errno} viene impostata ad - uno dei valori: + caso di errore. In questo caso la variabile \var{errno} assumerà uno dei + valori: \begin{errlist} \item[\macro{EEXIST}] \var{pathname} esiste e si è specificato \macro{O\_CREAT} e \macro{O\_EXCL}. @@ -237,7 +238,7 @@ sempre il file descriptor con il valore pi solo per le fifo, torneremo questo in \secref{sec:ipc_named_pipe}). \\ \macro{O\_NOCTTY} & se \var{pathname} si riferisce ad un device di terminale, questo non diventerà il terminale di controllo, anche se il - processo non ne ha ancora uno (si veda \secref{sec:sess_xxx}). \\ + processo non ne ha ancora uno (si veda \secref{sec:sess_ctrl_term}). \\ \macro{O\_SHLOCK} & opzione di BSD, acquisisce uno shared lock (vedi \secref{sec:file_locking}) sul file. Non è disponibile in Linux. \\ \macro{O\_EXLOCK} & opzione di BSD, acquisisce uno lock esclusivo (vedi @@ -292,11 +293,12 @@ sempre il file descriptor con il valore pi \label{tab:file_open_flags} \end{table} -\footnotetext[2]{la man page di \func{open} segnala che questa opzione è - difettosa su NFS, e che i programmi che la usano per stabilire un file di - lock possono incorrere in una race condition\index{race condition}. Si - consiglia come alternativa di usare un file con un nome univoco e la - funzione \func{link} per verificarne l'esistenza.} +\footnotetext[2]{la pagina di manuale di \func{open} segnala che questa + opzione è difettosa su NFS, e che i programmi che la usano per stabilire un + file di lock (vedi \secref{sec:ipc_file_lock}) possono incorrere in una race + condition\index{race condition}. Si consiglia come alternativa di usare un + file con un nome univoco e la funzione \func{link} per verificarne + l'esistenza.} \footnotetext[3]{\textit{Denial of Service}, si chiamano così attacchi miranti ad impedire un servizio causando una qualche forma di carico eccessivo per @@ -335,7 +337,8 @@ La funzione prevede diverse opzioni, che vengono specificate usando vari bit dell'argomento \param{flags}. Alcuni di questi bit vanno anche a costituire il flag di stato del file (o \textit{file status flag}), che è mantenuto nel campo \var{f\_flags} della struttura \var{file} (al solito si veda lo schema -di \curfig). Essi sono divisi in tre categorie principali: +di \figref{fig:file_proc_file}). Essi sono divisi in tre categorie +principali: \begin{itemize} \item \textsl{i bit delle modalità di accesso}: specificano con quale modalità si accederà al file: i valori possibili sono lettura, scrittura o @@ -386,7 +389,7 @@ descriptor ritorna disponibile; il suo prototipo Chiude il descrittore \var{fd}. \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di errore, - ed in questo caso \var{errno} è impostata ai valori: + ed in questo caso \var{errno} assumerà uno dei valori: \begin{errlist} \item[\macro{EBADF}] \var{fd} non è un descrittore valido. \item[\macro{EINTR}] la funzione è stata interrotta da un segnale. @@ -433,8 +436,8 @@ lettura e scrittura avvengono a partire da questa posizione che viene automaticamente spostata in avanti del numero di byte letti o scritti. In genere (a meno di non avere richiesto la modalità \macro{O\_APPEND}) questa -posizione viene impostata a zero all'apertura del file. È possibile impostarla ad -un valore qualsiasi con la funzione \func{lseek}, il cui prototipo è: +posizione viene impostata a zero all'apertura del file. È possibile impostarla +ad un valore qualsiasi con la funzione \func{lseek}, il cui prototipo è: \begin{functions} \headdecl{sys/types.h} \headdecl{unistd.h} @@ -442,8 +445,8 @@ un valore qualsiasi con la funzione \func{lseek}, il cui prototipo Imposta la posizione attuale nel file. \bodydesc{La funzione ritorna valore della posizione corrente in caso di - successo e -1 in caso di errore nel qual caso \var{errno} viene impostata ad - uno dei valori: + successo e -1 in caso di errore nel qual caso \var{errno} assumerà uno dei + valori: \begin{errlist} \item[\macro{ESPIPE}] \param{fd} è una pipe, un socket o una fifo. \item[\macro{EINVAL}] \param{whence} non è un valore valido. @@ -485,11 +488,12 @@ essersi spostata, ma noi scriveremo alla posizione impostata in precedenza. Non tutti i file supportano la capacità di eseguire una \func{lseek}, in questo caso la funzione ritorna l'errore \macro{EPIPE}. Questo, oltre che per i tre casi citati nel prototipo, vale anche per tutti quei dispositivi che non -supportano questa funzione, come ad esempio per le \acr{tty}.\footnote{altri - sistemi, usando \macro{SEEK\_SET}, in questo caso ritornano il numero di - caratteri che vi sono stati scritti.} Lo standard POSIX però non specifica -niente al proposito. Infine alcuni device, ad esempio \file{/dev/null}, non -causano un errore ma restituiscono un valore indefinito. +supportano questa funzione, come ad esempio per i file di +terminale.\footnote{altri sistemi, usando \macro{SEEK\_SET}, in questo caso + ritornano il numero di caratteri che vi sono stati scritti.} Lo standard +POSIX però non specifica niente al proposito. Infine alcuni file speciali, ad +esempio \file{/dev/null}, non causano un errore ma restituiscono un valore +indefinito. \subsection{La funzione \func{read}} @@ -503,8 +507,7 @@ utilizzando la funzione \func{read}, il cui prototipo Cerca di leggere \var{count} byte dal file \var{fd} al buffer \var{buf}. \bodydesc{La funzione ritorna il numero di byte letti in caso di successo e - -1 in caso di errore, nel qual caso \var{errno} viene impostata ad uno dei - valori: + -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} \item[\macro{EINTR}] la funzione è stata interrotta da un segnale prima di aver potuto leggere qualsiasi dato. @@ -581,8 +584,8 @@ Cerca di leggere \var{count} byte dal file \var{fd}, a partire dalla posizione \var{offset}, nel buffer \var{buf}. \bodydesc{La funzione ritorna il numero di byte letti in caso di successo e -1 - in caso di errore, nel qual caso \var{errno} viene impostata secondo i valori - già visti per \func{read} e \func{lseek}.} + in caso di errore, nel qual caso \var{errno} assumerà i valori già visti per + \func{read} e \func{lseek}.} \end{prototype} \noindent che però diventa accessibile solo con la definizione della macro: \begin{verbatim} @@ -608,8 +611,7 @@ funzione \func{write}, il cui prototipo Scrive \var{count} byte dal buffer \var{buf} sul file \var{fd}. \bodydesc{La funzione ritorna il numero di byte scritti in caso di successo - e -1 in caso di errore, nel qual caso \var{errno} viene impostata ad uno dei - valori: + e -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} \item[\macro{EINVAL}] \var{fd} è connesso ad un oggetto che non consente la scrittura. @@ -654,8 +656,8 @@ Cerca di scrivere sul file \var{fd}, a partire dalla posizione \var{offset}, \var{count} byte dal buffer \var{buf}. \bodydesc{La funzione ritorna il numero di byte letti in caso di successo e -1 - in caso di errore, nel qual caso \var{errno} viene impostata secondo i valori - già visti per \func{write} e \func{lseek}.} + in caso di errore, nel qual caso \var{errno} assumerà i valori già visti per + \func{write} e \func{lseek}.} \end{prototype} \noindent e per essa valgono le stesse considerazioni fatte per \func{pread}. @@ -874,7 +876,7 @@ prototipo Crea una copia del file descriptor \param{oldfd}. \bodydesc{La funzione ritorna il nuovo file descriptor in caso di successo e - -1 in caso di errore, nel qual caso \var{errno} viene impostata ad uno dei + -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} \item[\macro{EBADF}] \param{oldfd} non è un file aperto. @@ -927,8 +929,7 @@ prototipo Rende \param{newfd} una copia del file descriptor \param{oldfd}. \bodydesc{La funzione ritorna il nuovo file descriptor in caso di successo e - -1 in caso di errore, nel qual caso \var{errno} viene impostata ad uno dei - valori: + -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} \item[\macro{EBADF}] \param{oldfd} non è un file aperto o \param{newfd} ha un valore fuori dall'intervallo consentito per i file descriptor. @@ -969,11 +970,11 @@ file descriptor viene usata la funzione \func{fcntl} il cui prototipo sul file \param{fd}. \bodydesc{La funzione ha valori di ritorno diversi a seconda - dell'operazione. In caso di errore il valore di ritorno è -1 e la - variabile \var{errno} viene impostata ad un opportuno codice, quelli validi - in generale sono: + dell'operazione. In caso di errore il valore di ritorno è sempre -1 ed il + codice dell'errore è restituito nella variabile \var{errno}; i codici + possibili dipendono dal tipo di operazione, l'unico valido in generale è: \begin{errlist} - \item[\macro{EBADF}] \param{oldfd} non è un file aperto. + \item[\macro{EBADF}] \param{fd} non è un file aperto. \end{errlist}} \end{functions} @@ -1002,24 +1003,23 @@ valori di \tabref{tab:file_open_flags}). \item[\macro{F\_SETFL}] imposta il \textit{file status flag} al valore specificato da \param{arg}, possono essere impostati solo i bit riportati - nella terza sezione di \tabref{tab:file_open_flags}.\footnote{la man page - riporta come impostabili solo \macro{O\_APPEND}, \macro{O\_NONBLOCK} e - \macro{O\_ASYNC}.} -\item[\macro{F\_GETLK}] se un file lock è attivo restituisce nella struttura - \param{lock} la struttura \type{flock} che impedisce l'acquisizione del - blocco, altrimenti imposta il campo \var{l\_type} a \macro{F\_UNLCK} (per i - dettagli sul \textit{file locking} vedi \secref{sec:file_locking}). -\item[\macro{F\_SETLK}] richiede il file lock specificato da \param{lock} se - \var{l\_type} è \macro{F\_RDLCK} o \macro{F\_WRLLCK} o lo rilascia se - \var{l\_type} è \macro{F\_UNLCK}. Se il lock è tenuto da qualcun'altro - ritorna immediatamente restituendo -1 e imposta \var{errno} a \macro{EACCES} o - \macro{EAGAIN} (per i dettagli sul \textit{file locking} vedi - \secref{sec:file_locking}). + nella terza sezione di \tabref{tab:file_open_flags}.\footnote{la pagina di + manuale riporta come impostabili solo \macro{O\_APPEND}, + \macro{O\_NONBLOCK} e \macro{O\_ASYNC}.} +\item[\macro{F\_GETLK}] richiede un controllo sul file lock specificato da + \param{lock}, sovrascrivendo la struttura da esso puntata con il risultato + (questa funzionalità è trattata in dettaglio in + \secref{sec:file_posix_lock}). +\item[\macro{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 + \macro{EACCES} o \macro{EAGAIN} (questa funzionalità è trattata in dettaglio + in \secref{sec:file_posix_lock}). \item[\macro{F\_SETLKW}] identica a \macro{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 \macro{EINTR} (per i dettagli sul \textit{file locking} vedi - \secref{sec:file_locking}). + \var{errno} a \macro{EINTR} (questa funzionalità è trattata in dettaglio in + \secref{sec:file_posix_lock}). \item[\macro{F\_GETOWN}] restituisce il \acr{pid} del processo o il process group che è preposto alla ricezione dei segnali \macro{SIGIO} e \macro{SIGURG} per gli eventi associati al file descriptor \var{fd}. Il @@ -1085,8 +1085,8 @@ per ogni singolo dispositivo. Il prototipo di questa funzione \bodydesc{La funzione nella maggior parte dei casi ritorna 0, alcune operazioni usano però il valore di ritorno per restituire informazioni. In - caso di errore viene sempre restituito -1 e \var{errno} viene impostata ad - uno dei valori seguenti: + caso di errore viene sempre restituito -1 ed \var{errno} assumerà uno dei + valori: \begin{errlist} \item[\macro{ENOTTY}] il file \param{fd} non è associato con un device, o la richiesta non è applicabile all'oggetto a cui fa riferimento \param{fd}.