%% Copyright (C) 2000-2004 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 "Prefazione",
+%% Free Software Foundation; with the Invariant Sections being "Un preambolo",
%% with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the
%% license is included in the section entitled "GNU Free Documentation
%% License".
\label{sec:file_open}
La funzione \funcd{open} è la funzione fondamentale per accedere ai file, ed è
-quella che crea l'associazione fra un pathname ed un file descriptor, il suo
+quella che crea l'associazione fra un
+\index{\textit{pathname}}\textit{pathname} ed un file descriptor, il suo
prototipo è:
\begin{functions}
\headdecl{sys/types.h}
dispositivo che non esiste.
\item[\errcode{ETXTBSY}] si è cercato di accedere in scrittura all'immagine
di un programma in esecuzione.
- \item[\errcode{ELOOP}] si sono incontrati troppi link simbolici nel risolvere
- pathname o si è indicato \const{O\_NOFOLLOW} e \param{pathname} è un link
- simbolico.
+ \item[\errcode{ELOOP}] si sono incontrati troppi link simbolici nel
+ risolvere il \textit{pathname} o si è indicato \const{O\_NOFOLLOW} e
+ \param{pathname} è un link simbolico.
\end{errlist}
ed inoltre \errval{EACCES}, \errval{ENAMETOOLONG}, \errval{ENOENT},
\errval{EROFS}, \errval{EFAULT}, \errval{ENOSPC}, \errval{ENOMEM},
\hline % modalità di apertura del file
\hline
\const{O\_CREAT} & se il file non esiste verrà creato, con le regole di
- titolarità del file viste in sez.~\ref{sec:file_ownership}. L'argomento
- \param{mode} deve essere specificato. \\
- \const{O\_EXCL} & usato in congiunzione con \const{O\_CREAT} fa sì che
- l'esistenza del file diventi un errore\protect\footnotemark\ che fa fallire
- \func{open} con \errcode{EEXIST}. \\
- \const{O\_NONBLOCK} & apre il file in modalità non bloccante. Questo
- valore specifica anche una modalità di operazione (vedi sotto), e
- comporta che \func{open} ritorni immediatamente (l'opzione ha senso
- solo per le fifo, torneremo questo in sez.~\ref{sec:ipc_named_pipe}). \\
- \const{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}). \\
+ titolarità del file viste in
+ sez.~\ref{sec:file_ownership}. L'argomento
+ \param{mode} deve essere specificato. \\
+ \const{O\_EXCL} & usato in congiunzione con \const{O\_CREAT} fa sì che
+ l'esistenza del file diventi un
+ errore\protect\footnotemark\ che fa fallire
+ \func{open} con \errcode{EEXIST}. \\
+ \const{O\_NONBLOCK}& apre il file in modalità non bloccante. Questo
+ valore specifica anche una modalità di operazione (vedi
+ sotto), e comporta che \func{open} ritorni
+ immediatamente (l'opzione ha senso solo per le fifo,
+ torneremo questo in sez.~\ref{sec:ipc_named_pipe}). \\
+ \const{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\_SHLOCK} & opzione di BSD, acquisisce uno shared lock (vedi
- sez.~\ref{sec:file_locking}) sul file. Non è disponibile in Linux. \\
+ sez.~\ref{sec:file_locking}) sul file. Non è
+ disponibile in Linux. \\
\const{O\_EXLOCK} & opzione di BSD, acquisisce uno lock esclusivo (vedi
- sez.~\ref{sec:file_locking}) sul file. Non è disponibile in Linux. \\
- \const{O\_TRUNC} & se il file esiste ed è un file di dati e la modalità di
- apertura consente la scrittura, allora la sua lunghezza verrà troncata a
- zero. Se il file è un terminale o una fifo il flag verrà ignorato, negli
- altri casi il comportamento non è specificato. \\
- \const{O\_NOFOLLOW} & se \param{pathname} è un link simbolico la chiamata
- fallisce. Questa è un'estensione BSD aggiunta in Linux dal kernel 2.1.126.
- Nelle versioni precedenti i link simbolici sono sempre seguiti, e questa
- opzione è ignorata. \\
- \const{O\_DIRECTORY} & se \param{pathname} non è una directory la chiamata
- fallisce. Questo flag è specifico di Linux ed è stato introdotto con il
- kernel 2.1.126 per evitare dei
- \textit{DoS}\index{DoS}\protect\footnotemark\ quando
- \func{opendir} viene chiamata su una
- fifo o su un device di unità a nastri, non deve essere utilizzato al di
- fuori dell'implementazione di \func{opendir}. \\
- \const{O\_LARGEFILE} & nel caso di sistemi a 32 bit che supportano file di
- grandi dimensioni consente di aprire file le cui dimensioni non possono
- essere rappresentate da numeri a 31 bit. \\
+ sez.~\ref{sec:file_locking}) sul file. Non è
+ disponibile in Linux. \\
+ \const{O\_TRUNC} & se il file esiste ed è un file di dati e la modalità di
+ apertura consente la scrittura, allora la sua
+ lunghezza verrà troncata a zero. Se il file è un
+ terminale o una fifo il flag verrà ignorato, negli
+ altri casi il comportamento non è specificato. \\
+ \const{O\_NOFOLLOW}&se \param{pathname} è un link simbolico la chiamata
+ fallisce. Questa è un'estensione BSD aggiunta in Linux
+ dal kernel 2.1.126. Nelle versioni precedenti i link
+ simbolici sono sempre seguiti, e questa opzione è
+ ignorata. \\
+ \const{O\_DIRECTORY}& se \param{pathname} non è una directory la chiamata
+ fallisce. Questo flag è specifico di Linux ed è stato
+ introdotto con il kernel 2.1.126 per evitare dei
+ \textit{DoS}\index{DoS}\protect\footnotemark\ quando
+ \func{opendir} viene chiamata su una fifo o su un
+ device di unità a nastri, non deve essere utilizzato
+ al di fuori dell'implementazione di \func{opendir}. \\
+ \const{O\_LARGEFILE}& nel caso di sistemi a 32 bit che supportano file di
+ grandi dimensioni consente di aprire file le cui
+ dimensioni non possono essere rappresentate da numeri
+ a 31 bit. \\
\hline
\hline % modalità di operazione col file
\const{O\_APPEND} & il file viene aperto in append mode. Prima di ciascuna
- scrittura la posizione corrente viene sempre impostata alla fine del
- file. Può causare corruzione del file con NFS se più di un processo scrive
- allo stesso tempo.\footnotemark\\
- \const{O\_NONBLOCK} & il file viene aperto in modalità non bloccante per
- le operazioni di I/O (che tratteremo in sez.~\ref{sec:file_noblocking}):
- questo significa il fallimento di \func{read} in assenza di dati da
- leggere e quello di \func{write} in caso di impossibilità di scrivere
- immediatamente. Questa modalità ha senso solo per le fifo e per alcuni
- file di dispositivo. \\
+ scrittura la posizione corrente viene sempre impostata
+ alla fine del file. Può causare corruzione del file
+ con NFS se più di un processo scrive allo stesso
+ tempo.\footnotemark\\
+ \const{O\_NONBLOCK}&il file viene aperto in modalità non bloccante per
+ le operazioni di I/O (che tratteremo in
+ sez.~\ref{sec:file_noblocking}): questo significa il
+ fallimento di \func{read} in assenza di dati da
+ leggere e quello di \func{write} in caso di
+ impossibilità di scrivere immediatamente. Questa
+ modalità ha senso solo per le fifo e per alcuni file
+ di dispositivo. \\
\const{O\_NDELAY} & in Linux\footnotemark\ è sinonimo di
- \const{O\_NONBLOCK}.\\
- \const{O\_ASYNC} & apre il file per l'I/O in modalità
- asincrona (vedi sez.~\ref{sec:file_asyncronous_io}). Quando è impostato
- viene generato il segnale \const{SIGIO} tutte le volte che sono disponibili
- dati in input sul file. \\
- \const{O\_SYNC} & apre il file per l'input/output sincrono: ogni
- \func{write} bloccherà fino al completamento della scrittura di tutti i
- dati sull'hardware sottostante.\\
- \const{O\_FSYNC} & sinonimo di \const{O\_SYNC}. \\
- \const{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 in fase
- di montaggio.\\
+ \const{O\_NONBLOCK}.\\
+ \const{O\_ASYNC} & apre il file per l'I/O in modalità asincrona (vedi
+ sez.~\ref{sec:file_asyncronous_io}). Quando è
+ impostato viene generato il segnale \const{SIGIO}
+ tutte le volte che sono disponibili dati in input
+ sul file. \\
+ \const{O\_SYNC} & apre il file per l'input/output sincrono: ogni
+ \func{write} bloccherà fino al completamento della
+ scrittura di tutti i dati sull'hardware sottostante.\\
+ \const{O\_FSYNC} & sinonimo di \const{O\_SYNC}. \\
+ \const{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 in fase di montaggio.\\
\hline
\end{tabular}
\caption{Valori e significato dei vari bit del \textit{file status flag}.}
\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
\textsl{file di lock}\index{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
+ condition\index{\textit{race~condition}}. Si consiglia come alternativa di
+ usare un file con un nome univoco e la funzione \func{link} per verificarne
l'esistenza (vedi sez.~\ref{sec:ipc_file_lock}).}
\footnotetext[3]{\textit{Denial of Service}\index{DoS}, si chiamano così
aperto anche da un altro processo che vi ha scritto, la fine del file può
essersi spostata, ma noi scriveremo alla posizione impostata in precedenza
(questa è una potenziale sorgente di \textit{race condition}
-\index{race condition}, vedi sez.~\ref{sec:file_atomic}).
+\index{\textit{race~condition}}, vedi sez.~\ref{sec:file_atomic}).
Non tutti i file supportano la capacità di eseguire una \func{lseek}, in
questo caso la funzione ritorna l'errore \errcode{EPIPE}. Questo, oltre che per
vari processi devono scrivere alla fine di un file (ad esempio un file di
log). Come accennato in sez.~\ref{sec:file_lseek} impostare la posizione alla
fine del file e poi scrivere può condurre ad una \textit{race
- condition}\index{race condition}: infatti può succedere che un secondo
-processo scriva alla fine del file fra la \func{lseek} e la \func{write}; in
-questo caso, come abbiamo appena visto, il file sarà esteso, ma il nostro
-primo processo avrà ancora la posizione corrente impostata con la \func{lseek}
-che non corrisponde più alla fine del file, e la successiva \func{write}
-sovrascriverà i dati del secondo processo.
+ condition}\index{\textit{race~condition}}: infatti può succedere che un
+secondo processo scriva alla fine del file fra la \func{lseek} e la
+\func{write}; in questo caso, come abbiamo appena visto, il file sarà esteso,
+ma il nostro primo processo avrà ancora la posizione corrente impostata con la
+\func{lseek} che non corrisponde più alla fine del file, e la successiva
+\func{write} sovrascriverà i dati del secondo processo.
Il problema è che usare due system call in successione non è un'operazione
atomica; il problema è stato risolto introducendo la modalità
creare un \textsl{file di lock}\index{file!di lock}, bloccandosi se il file
esiste. In questo caso la sequenza logica porterebbe a verificare prima
l'esistenza del file con una \func{stat} per poi crearlo con una \func{creat};
-di nuovo avremmo la possibilità di una race condition\index{race condition} da
-parte di un altro processo che crea lo stesso file fra il controllo e la
-creazione.
+di nuovo avremmo la possibilità di una race
+condition\index{\textit{race~condition}} da parte di un altro processo che
+crea lo stesso file fra il controllo e la creazione.
Per questo motivo sono stati introdotti per \func{open} i due flag
\const{O\_CREAT} e \const{O\_EXCL}. In questo modo l'operazione di controllo
della \textit{file table} a cui entrambi fanno riferimento). L'unica
differenza fra due file descriptor duplicati è che ciascuno avrà il suo
\textit{file descriptor flag}; a questo proposito va specificato che nel caso
-di \func{dup} il flag di \textit{close-on-exec}\index{close-on-exec} (vedi
-sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_fcntl}) viene sempre cancellato
-nella copia.
+di \func{dup} il flag di \textit{close-on-exec}\index{\textit{close-on-exec}}
+(vedi sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_fcntl}) viene sempre
+cancellato nella copia.
L'uso principale di questa funzione è per la redirezione dell'input e
dell'output fra l'esecuzione di una \func{fork} e la successiva \func{exec};
massimo numero di descrittori consentito.
\item[\const{F\_SETFD}] imposta il valore del \textit{file descriptor flag} al
valore specificato con \param{arg}. Al momento l'unico bit usato è quello di
- \textit{close-on-exec}\index{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.
+ \textit{close-on-exec}\index{\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\_GETFD}] ritorna il valore del \textit{file descriptor flag} di
\param{fd} o -1 in caso di errore; se \const{FD\_CLOEXEC} è impostato i file
descriptor aperti vengono chiusi attraverso una \func{exec} altrimenti (il
\textit{file locking}\index{file!locking} saranno esaminate in
sez.~\ref{sec:file_locking}).
-
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
comando \const{F\_GETFL}) è necessario estrarre i bit corrispondenti nel