La \textit{process table} è una tabella che contiene una voce per ciascun
processo attivo nel sistema. In Linux ciascuna voce è costituita da una
-struttura di tipo \var{task\_struct} nella quale sono raccolte tutte le
+struttura di tipo \struct{task\_struct} nella quale sono raccolte tutte le
informazioni relative al processo; fra queste informazioni c'è anche il
-puntatore ad una ulteriore struttura di tipo \var{files\_struct}, in cui sono
-contenute le informazioni relative ai file che il processo ha aperto, ed in
-particolare:
+puntatore ad una ulteriore struttura di tipo \struct{files\_struct}, in cui
+sono contenute le informazioni relative ai file che il processo ha aperto, ed
+in particolare:
\begin{itemize*}
\item i flag relativi ai file descriptor.
\item il numero di file aperti.
La \textit{file table} è una tabella che contiene una voce per ciascun file
che è stato aperto nel sistema. In Linux è costituita da strutture di tipo
-\var{file}; in ciascuna di esse sono tenute varie informazioni relative al
+\struct{file}; in ciascuna di esse sono tenute varie informazioni relative al
file, fra cui:
\begin{itemize*}
\item lo stato del file (nel campo \var{f\_flags}).
\item il valore della posizione corrente (l'\textit{offset}) nel file (nel
campo \var{f\_pos}).
\item un puntatore all'inode\index{inode}\footnote{nel kernel 2.4.x si è in
- realtà passati ad un puntatore ad una struttura \var{dentry} che punta a
+ realtà passati ad un puntatore ad una struttura \struct{dentry} che punta a
sua volta all'inode\index{inode} passando per la nuova struttura del VFS.}
del file.
%\item un puntatore alla tabella delle funzioni \footnote{la struttura
inviati i dati in uscita (sempre nel caso della shell, è associato all'uscita
del terminale, e quindi alla scrittura sullo schermo). Il terzo è lo
\textit{standard error}, su cui viene inviato l'output relativo agli errori,
-ed è anch'esso associato all'uscita del termininale. Lo standard POSIX.1
+ed è anch'esso associato all'uscita del terminale. Lo standard POSIX.1
provvede tre costanti simboliche, definite nell'header \file{unistd.h}, al
posto di questi valori numerici:
\begin{table}[htb]
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
dimensioni del vettore di puntatori con cui era realizzata la tabella dei file
-descriptor dentro \var{file\_struct}; questo limite intrinseco nei kernel più
-recenti non sussiste più, dato che si è passati da un vettore ad una lista, ma
-restano i limiti imposti dall'amministratore (vedi \secref{sec:sys_limits}).
+descriptor dentro \struct{file\_struct}; questo limite intrinseco nei kernel
+più recenti non sussiste più, dato che si è passati da un vettore ad una
+lista, ma restano i limiti imposti dall'amministratore (vedi
+\secref{sec:sys_limits}).
\subsection{La funzione \func{open}}
\label{sec:file_open}
-La funzione \func{open} è la funzione fondamentale per accedere ai file, ed è
+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
prototipo è:
\begin{functions}
\headdecl{fcntl.h}
\funcdecl{int open(const char *pathname, int flags)}
\funcdecl{int open(const char *pathname, int flags, mode\_t mode)}
- Apre il file indicato da \var{pathname} nella modalità indicata da
- \var{flags}, e, nel caso il file sia creato, con gli eventuali permessi
- specificati da \var{mode}.
+ Apre il file indicato da \param{pathname} nella modalità indicata da
+ \param{flags}, e, nel caso il file sia creato, con gli eventuali permessi
+ specificati da \param{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} assumerà uno dei
valori:
\begin{errlist}
- \item[\errcode{EEXIST}] \var{pathname} esiste e si è specificato
+ \item[\errcode{EEXIST}] \param{pathname} esiste e si è specificato
\const{O\_CREAT} e \const{O\_EXCL}.
- \item[\errcode{EISDIR}] \var{pathname} indica una directory e si è tentato
+ \item[\errcode{EISDIR}] \param{pathname} indica una directory e si è tentato
l'accesso in scrittura.
\item[\errcode{ENOTDIR}] si è specificato \const{O\_DIRECTORY} e
- \var{pathname} non è una directory.
+ \param{pathname} non è una directory.
\item[\errcode{ENXIO}] si sono impostati \const{O\_NOBLOCK} o
\const{O\_WRONLY} ed il file è una fifo che non viene letta da nessun
- processo o \var{pathname} è un file di dispositivo ma il dispositivo è
+ processo o \param{pathname} è un file di dispositivo ma il dispositivo è
assente.
- \item[\errcode{ENODEV}] \var{pathname} si riferisce a un file di dispositivo
- che non esiste.
+ \item[\errcode{ENODEV}] \param{pathname} si riferisce a un file di
+ 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 \var{pathname} è un link
+ pathname o si è indicato \const{O\_NOFOLLOW} e \param{pathname} è un link
simbolico.
\end{errlist}
ed inoltre \errval{EACCES}, \errval{ENAMETOOLONG}, \errval{ENOENT},
\end{functions}
La funzione apre il file, usando il primo file descriptor libero, e crea
-l'opportuna voce (cioè la struttura \var{file}) nella file table. Viene usato
-sempre il file descriptor con il valore più basso.
+l'opportuna voce (cioè la struttura \struct{file}) nella file table. Viene
+usato sempre il file descriptor con il valore più basso.
\begin{table}[!htb]
\centering
\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 \secref{sec:file_ownership}. Il parametro
- \var{mode} deve essere specificato. \\
+ titolarità del file viste in \secref{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}. \\
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 \secref{sec:ipc_named_pipe}). \\
- \const{O\_NOCTTY} & se \var{pathname} si riferisce ad un device di
+ \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 \secref{sec:sess_ctrl_term}). \\
\const{O\_SHLOCK} & opzione di BSD, acquisisce uno shared lock (vedi
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 \var{pathname} è un link simbolico la chiamata
+ \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 \var{pathname} non è una directory la chiamata
+ \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
file con un nome univoco e la funzione \func{link} per verificarne
l'esistenza (vedi \secref{sec:ipc_file_lock}).}
-\footnotetext[3]{\textit{Denial of Service}, si chiamano così attacchi miranti
- ad impedire un servizio causando una qualche forma di carico eccessivo per
- il sistema, che resta bloccato nelle risposte all'attacco.}
+\footnotetext[3]{\textit{Denial of Service}\index{DoS}, si chiamano così
+ attacchi miranti ad impedire un servizio causando una qualche forma di
+ carico eccessivo per il sistema, che resta bloccato nelle risposte
+ all'attacco.}
\footnotetext[4]{il problema è che NFS non supporta la scrittura in append, ed
il kernel deve simularla, ma questo comporta la possibilità di una race
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
+campo \var{f\_flags} della struttura \struct{file} (al solito si veda lo schema
di \figref{fig:file_proc_file}). Essi sono divisi in tre categorie
principali:
\begin{itemize}
Nelle prime versioni di Unix i valori di \param{flag} specificabili per
\func{open} erano solo quelli relativi alle modalità di accesso del file. Per
questo motivo per creare un nuovo file c'era una system call apposita,
-\func{creat}, il cui prototipo è:
+\funcd{creat}, il cui prototipo è:
\begin{prototype}{fcntl.h}
{int creat(const char *pathname, mode\_t mode)}
- Crea un nuovo file vuoto, con i permessi specificati da \var{mode}. È del
+ Crea un nuovo file vuoto, con i permessi specificati da \param{mode}. È del
tutto equivalente a \code{open(filedes, O\_CREAT|O\_WRONLY|O\_TRUNC, mode)}.
\end{prototype}
\noindent adesso questa funzione resta solo per compatibilità con i vecchi
\subsection{La funzione \func{close}}
\label{sec:file_close}
-La funzione \func{close} permette di chiudere un file, in questo modo il file
+La funzione \funcd{close} permette di chiudere un file, in questo modo il file
descriptor ritorna disponibile; il suo prototipo è:
\begin{prototype}{unistd.h}{int close(int fd)}
- Chiude il descrittore \var{fd}.
+ Chiude il descrittore \param{fd}.
\bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di errore,
ed in questo caso \var{errno} assumerà uno dei valori:
\begin{errlist}
- \item[\errcode{EBADF}] \var{fd} non è un descrittore valido.
+ \item[\errcode{EBADF}] \param{fd} non è un descrittore valido.
\item[\errcode{EINTR}] la funzione è stata interrotta da un segnale.
\end{errlist}
ed inoltre \errval{EIO}.}
La chiusura di un file rilascia ogni blocco (il \textit{file
locking}\index{file!locking} è trattato in \secref{sec:file_locking}) che il
-processo poteva avere acquisito su di esso; se \var{fd} è l'ultimo riferimento
-(di eventuali copie) ad un file aperto, tutte le risorse nella file table
-vengono rilasciate. Infine se il file descriptor era l'ultimo riferimento ad
-un file su disco quest'ultimo viene cancellato.
+processo poteva avere acquisito su di esso; se \param{fd} è l'ultimo
+riferimento (di eventuali copie) ad un file aperto, tutte le risorse nella
+file table vengono rilasciate. Infine se il file descriptor era l'ultimo
+riferimento ad un file su disco quest'ultimo viene cancellato.
Si ricordi che quando un processo termina anche tutti i suoi file descriptor
vengono chiusi, molti programmi sfruttano questa caratteristica e non usano
Come già accennato in \secref{sec:file_fd} a ciascun file aperto è associata
una \textsl{posizione corrente nel file} (il cosiddetto \textit{file offset},
-mantenuto nel campo \var{f\_pos} di \var{file}) espressa da un numero intero
+mantenuto nel campo \var{f\_pos} di \struct{file}) espressa da un numero intero
positivo come numero di byte dall'inizio del file. Tutte le operazioni di
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à \const{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 è:
+ad un valore qualsiasi con la funzione \funcd{lseek}, il cui prototipo è:
\begin{functions}
\headdecl{sys/types.h}
\headdecl{unistd.h}
impostare la posizione corrente anche oltre la fine del file, e alla
successiva scrittura il file sarà esteso. La chiamata non causa nessuna
attività di input/output, si limita a modificare la posizione corrente nel
-kernel (cioè \var{f\_pos} in \var{file}, vedi \figref{fig:file_proc_file}).
+kernel (cioè \var{f\_pos} in \param{file}, vedi \figref{fig:file_proc_file}).
Dato che la funzione ritorna la nuova posizione, usando il valore zero per
\param{offset} si può riottenere la posizione corrente nel file chiamando la
Una volta che un file è stato aperto (con il permesso in lettura) su possono
-leggere i dati che contiene utilizzando la funzione \func{read}, il cui
+leggere i dati che contiene utilizzando la funzione \funcd{read}, il cui
prototipo è:
\begin{prototype}{unistd.h}{ssize\_t read(int fd, void * buf, size\_t count)}
- Cerca di leggere \var{count} byte dal file \var{fd} al buffer \var{buf}.
+ Cerca di leggere \param{count} byte dal file \param{fd} al buffer
+ \param{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} assumerà uno dei valori:
\end{errlist}
ed inoltre \errval{EBADF}, \errval{EIO}, \errval{EISDIR}, \errval{EBADF},
\errval{EINVAL} e \errval{EFAULT} ed eventuali altri errori dipendenti dalla
- natura dell'oggetto connesso a \var{fd}.}
+ natura dell'oggetto connesso a \param{fd}.}
\end{prototype}
-La funzione tenta di leggere \var{count} byte a partire dalla posizione
+La funzione tenta di leggere \param{count} byte a partire dalla posizione
corrente nel file. Dopo la lettura la posizione sul file è spostata
-automaticamente in avanti del numero di byte letti. Se \var{count} è zero la
+automaticamente in avanti del numero di byte letti. Se \param{count} è zero la
funzione restituisce zero senza nessun altro risultato.
Si deve sempre tener presente che non è detto che la funzione \func{read}
aggiunto con la versione 2.1, in versioni precedenti sia del kernel che
delle librerie la funzione non è disponibile.} (quello che viene chiamato
normalmente Unix98, vedi \secref{sec:intro_opengroup}) è stata introdotta la
-definizione di un'altra funzione di lettura, \func{pread}, il cui prototipo è:
+definizione di un'altra funzione di lettura, \funcd{pread}, il cui prototipo è:
\begin{prototype}{unistd.h}
{ssize\_t pread(int fd, void * buf, size\_t count, off\_t offset)}
-Cerca di leggere \var{count} byte dal file \var{fd}, a partire dalla posizione
-\var{offset}, nel buffer \var{buf}.
+Cerca di leggere \param{count} byte dal file \param{fd}, a partire dalla
+posizione \param{offset}, nel buffer \param{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} assumerà i valori già visti per
posizione corrente sul file, ma permette di eseguire l'operazione
atomicamente. Questo può essere importante quando la posizione sul file viene
condivisa da processi diversi (vedi \secref{sec:file_sharing}). Il valore di
-\var{offset} fa sempre riferimento all'inizio del file.
+\param{offset} fa sempre riferimento all'inizio del file.
\subsection{La funzione \func{write}}
\label{sec:file_write}
Una volta che un file è stato aperto (con il permesso in scrittura) su può
-scrivere su di esso utilizzando la funzione \func{write}, il cui prototipo è:
+scrivere su di esso utilizzando la funzione \funcd{write}, il cui prototipo è:
\begin{prototype}{unistd.h}{ssize\_t write(int fd, void * buf, size\_t count)}
- Scrive \var{count} byte dal buffer \var{buf} sul file \var{fd}.
+ Scrive \param{count} byte dal buffer \param{buf} sul file \param{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} assumerà uno dei valori:
\begin{errlist}
- \item[\errcode{EINVAL}] \var{fd} è connesso ad un oggetto che non consente la
- scrittura.
+ \item[\errcode{EINVAL}] \param{fd} è connesso ad un oggetto che non consente
+ la scrittura.
\item[\errcode{EFBIG}] si è cercato di scrivere oltre la dimensione massima
consentita dal filesystem o il limite per le dimensioni dei file del
processo o su una posizione oltre il massimo consentito.
- \item[\errcode{EPIPE}] \var{fd} è connesso ad una pipe il cui altro capo è
+ \item[\errcode{EPIPE}] \param{fd} è connesso ad una pipe il cui altro capo è
chiuso in lettura; in questo caso viene anche generato il segnale
\const{SIGPIPE}, se questo viene gestito (o bloccato o ignorato) la
funzione ritorna questo errore.
\end{errlist}
ed inoltre \errval{EBADF}, \errval{EIO}, \errval{EISDIR}, \errval{EBADF},
\errval{ENOSPC}, \errval{EINVAL} e \errval{EFAULT} ed eventuali altri errori
- dipendenti dalla natura dell'oggetto connesso a \var{fd}.}
+ dipendenti dalla natura dell'oggetto connesso a \param{fd}.}
\end{prototype}
-Come nel caso di \func{read} la funzione tenta di scrivere \var{count} byte a
-partire dalla posizione corrente nel file e sposta automaticamente la
+Come nel caso di \func{read} la funzione tenta di scrivere \param{count} byte
+a partire dalla posizione corrente nel file e sposta automaticamente la
posizione in avanti del numero di byte scritti. Se il file è aperto in
modalità \const{O\_APPEND} i dati vengono sempre scritti alla fine del file.
Lo standard POSIX richiede che i dati scritti siano immediatamente disponibili
ritornata; ma dati i meccanismi di caching non è detto che tutti i filesystem
supportino questa capacità.
-Se \var{count} è zero la funzione restituisce zero senza fare nient'altro. Per
-i file ordinari il numero di byte scritti è sempre uguale a quello indicato
-da \var{count}, a meno di un errore. Negli altri casi si ha lo stesso
-comportamento di \func{read}.
+Se \param{count} è zero la funzione restituisce zero senza fare nient'altro.
+Per i file ordinari il numero di byte scritti è sempre uguale a quello
+indicato da \param{count}, a meno di un errore. Negli altri casi si ha lo
+stesso comportamento di \func{read}.
-Anche per \func{write} lo standard Unix98 definisce un'analoga \func{pwrite}
+Anche per \func{write} lo standard Unix98 definisce un'analoga \funcd{pwrite}
per scrivere alla posizione indicata senza modificare la posizione corrente
nel file, il suo prototipo è:
\begin{prototype}{unistd.h}
{ssize\_t pwrite(int fd, void * buf, size\_t count, off\_t offset)}
-Cerca di scrivere sul file \var{fd}, a partire dalla posizione \var{offset},
-\var{count} byte dal buffer \var{buf}.
+Cerca di scrivere sul file \param{fd}, a partire dalla posizione
+\param{offset}, \param{count} byte dal buffer \param{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} assumerà i valori già visti per
su disco; sulla base di quanto visto in \secref{sec:file_fd} avremo una
situazione come quella illustrata in \figref{fig:file_mult_acc}: ciascun
processo avrà una sua voce nella \textit{file table} referenziata da un
-diverso file descriptor nella sua \var{file\_struct}. Entrambe le voci nella
-\textit{file table} faranno però riferimento allo stesso inode\index{inode} su
-disco.
+diverso file descriptor nella sua \struct{file\_struct}. Entrambe le voci
+nella \textit{file table} faranno però riferimento allo stesso
+inode\index{inode} su disco.
Questo significa che ciascun processo avrà la sua posizione corrente sul file,
la sua modalità di accesso e versioni proprie di tutte le proprietà che
dimensione corrente del file letta dall'inode\index{inode}. Dopo la
scrittura il file viene automaticamente esteso.
\item l'effetto di \func{lseek} è solo quello di cambiare il campo
- \var{f\_pos} nella struttura \var{file} della \textit{file table}, non c'è
- nessuna operazione sul file su disco. Quando la si usa per porsi alla fine
- del file la posizione viene impostata leggendo la dimensione corrente
+ \var{f\_pos} nella struttura \struct{file} della \textit{file table}, non
+ c'è nessuna operazione sul file su disco. Quando la si usa per porsi alla
+ fine del file la posizione viene impostata leggendo la dimensione corrente
dall'inode\index{inode}.
\end{itemize}
di una \func{fork} (si ricordi quanto detto in \secref{sec:proc_fork}). La
situazione è illustrata in \figref{fig:file_acc_child}; dato che il processo
figlio riceve una copia dello spazio di indirizzi del padre, riceverà anche
-una copia di \var{file\_struct} e relativa tabella dei file aperti.
+una copia di \struct{file\_struct} e relativa tabella dei file aperti.
In questo modo padre e figlio avranno gli stessi file descriptor che faranno
riferimento alla stessa voce nella \textit{file table}, condividendo così la
Si noti inoltre che anche i flag di stato del file (quelli impostati
dall'argomento \param{flag} di \func{open}) essendo tenuti nella voce della
\textit{file table}\footnote{per la precisione nel campo \var{f\_flags} di
- \var{file}.}, vengono in questo caso condivisi. Ai file però sono associati
-anche altri flag, dei quali l'unico usato al momento è \const{FD\_CLOEXEC},
-detti \textit{file descriptor flags}. Questi ultimi sono tenuti invece in
-\var{file\_struct}, e perciò sono specifici di ciascun processo e non vengono
-modificati dalle azioni degli altri anche in caso di condivisione della stessa
-voce della \textit{file table}.
+ \struct{file}.}, vengono in questo caso condivisi. Ai file però sono
+associati anche altri flag, dei quali l'unico usato al momento è
+\const{FD\_CLOEXEC}, detti \textit{file descriptor flags}. Questi ultimi sono
+tenuti invece in \struct{file\_struct}, e perciò sono specifici di ciascun
+processo e non vengono modificati dalle azioni degli altri anche in caso di
+condivisione della stessa voce della \textit{file table}.
questo dà la garanzia assoluta che i dati siano integri dopo la chiamata,
l'hardware dei dischi è in genere dotato di un suo meccanismo interno di
ottimizzazione per l'accesso al disco che può ritardare ulteriormente la
- scrittura effettiva.} La prima di queste funzioni è \func{sync} il cui
+ scrittura effettiva.} La prima di queste funzioni è \funcd{sync} il cui
prototipo è:
\begin{prototype}{unistd.h}{int sync(void)}
Quando si vogliono scaricare soltanto i dati di un file (ad esempio essere
sicuri che i dati di un database sono stati registrati su disco) si possono
-usare le due funzioni \func{fsync} e \func{fdatasync}, i cui prototipi sono:
+usare le due funzioni \funcd{fsync} e \funcd{fdatasync}, i cui prototipi sono:
\begin{functions}
\headdecl{unistd.h}
\funcdecl{int fsync(int fd)}
file specificato, ed attendono fino alla conclusione delle operazioni;
\func{fsync} forza anche la sincronizzazione dei metadati del file (che
riguardano sia le modifiche alle tabelle di allocazione dei settori, che gli
-altri dati contenuti nell'inode\index{inode} che si leggono con \var{fstat}
+altri dati contenuti nell'inode\index{inode} che si leggono con \func{fstat},
come i tempi del file).
Si tenga presente che questo non comporta la sincronizzazione della
Abbiamo già visto in \secref{sec:file_sharing} come un processo figlio
condivida gli stessi file descriptor del padre; è possibile però ottenere un
comportamento analogo all'interno di uno stesso processo \textit{duplicando}
-un file descriptor. Per far questo si usa la funzione \func{dup} il cui
+un file descriptor. Per far questo si usa la funzione \funcd{dup} il cui
prototipo è:
\begin{prototype}{unistd.h}{int dup(int oldfd)}
Crea una copia del file descriptor \param{oldfd}.
file descriptor è una copia esatta del precedente ed entrambi possono essere
interscambiati nell'uso. Per capire meglio il funzionamento della funzione si
può fare riferimento a \figref{fig:file_dup}: l'effetto della funzione è
-semplicemente quello di copiare il valore nella struttura \var{file\_struct},
-cosicché anche il nuovo file descriptor fa riferimento alla stessa voce
-nella \textit{file table}; per questo si dice che il nuovo file descriptor è
-\textsl{duplicato}, da cui il nome della funzione.
+semplicemente quello di copiare il valore nella struttura
+\struct{file\_struct}, cosicché anche il nuovo file descriptor fa riferimento
+alla stessa voce nella \textit{file table}; per questo si dice che il nuovo
+file descriptor è \textsl{duplicato}, da cui il nome della funzione.
\begin{figure}[htb]
\centering \includegraphics[width=15cm]{img/filedup}
diventa così possibile associare un file (o una pipe) allo standard input o
allo standard output (torneremo sull'argomento in \secref{sec:ipc_pipe_use},
quando tratteremo le pipe). Per fare questo in genere occorre prima chiudere
-il file che si vuole sostituire, cossicché il suo file descriptor possa esser
+il file che si vuole sostituire, cosicché il suo file descriptor possa esser
restituito alla chiamata di \func{dup}, come primo file descriptor
disponibile.
Dato che questa è l'operazione più comune, è prevista una diversa versione
-della funzione, \func{dup2}, che permette di specificare esplicitamente qual'è
-il valore di file descriptor che si vuole avere come duplicato; il suo
+della funzione, \funcd{dup2}, che permette di specificare esplicitamente
+qual'è il valore di file descriptor che si vuole avere come duplicato; il suo
prototipo è:
\begin{prototype}{unistd.h}{int dup2(int oldfd, int newfd)}
la sintassi \code{fnctl(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\footnote{a parte la sistassi ed i
+La sola differenza fra le due funzioni\footnote{a parte la sintassi ed i
diversi codici di errore.} è che \func{dup2} chiude il file descriptor
\param{newfd} se questo è già aperto, garantendo che la duplicazione sia
effettuata esattamente su di esso, invece \func{fcntl} restituisce il primo
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
- gesticono con questa funzione l'I/O asincrono (vedi
+ gestiscono con questa funzione l'I/O asincrono (vedi
\secref{sec:file_asyncronous_io}) e il file locking\index{file!locking}
(vedi \secref{sec:file_locking}).}
Per queste operazioni di manipolazione e di controllo su proprietà e
-caratteristiche un file descriptor, viene usata la funzione \func{fcntl}, il
+caratteristiche un file descriptor, viene usata la funzione \funcd{fcntl}, il
cui prototipo è:
\begin{functions}
\headdecl{unistd.h}
valori è 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 \var{fd}. In caso di
+ maggiore o uguale ad \param{arg} e ne fa una copia di \param{fd}. In caso di
successo ritorna il nuovo file descriptor. 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
\const{FD\_CLOEXEC}, che serve a richiedere che il file venga chiuso nella
esecuzione di una \func{exec} (vedi \secref{sec:proc_exec}).
\item[\const{F\_GETFD}] ritorna il valore del \textit{file descriptor flag} di
- \var{fd}, se \const{FD\_CLOEXEC} è impostato i file descriptor aperti
+ \param{fd}, se \const{FD\_CLOEXEC} è impostato i file descriptor aperti
vengono chiusi attraverso una \func{exec} altrimenti (il comportamento
predefinito) restano aperti.
\item[\const{F\_GETFL}] ritorna il valore del \textit{file status flag},
nel controllo di sessione; a ciascuno di essi è associato un
identificatore (un numero positivo analogo al \acr{pid}).} che è preposto
alla ricezione dei segnali \const{SIGIO} e \const{SIGURG} per gli eventi
- associati al file descriptor \var{fd}. Nel caso di un process group viene
+ associati al file descriptor \param{fd}. Nel caso di un process group viene
restituito un valore negativo il cui valore assoluto corrisponde
all'identificatore del process group.
\item[\const{F\_SETOWN}] imposta, con il valore dell'argomento \param{arg},
l'identificatore del processo o del \textit{process group} che riceverà i
segnali \const{SIGIO} e \const{SIGURG} per gli eventi associati al file
- descriptor \var{fd}. Come per \const{F\_GETOWN}, per impostare un process
+ descriptor \param{fd}. Come per \const{F\_GETOWN}, per impostare un process
group si deve usare per \param{arg} un valore negativo, il cui valore
assoluto corrisponde all'identificatore del process group.
\item[\const{F\_GETSIG}] restituisce il valore del segnale inviato quando ci
valore zero indica di usare il segnale predefinito, \const{SIGIO}. Un altro
valore (compreso lo stesso \const{SIGIO}) specifica il segnale voluto; l'uso
di un valore diverso da zero permette inoltre, se si è installato il
- manipolatore del segnale come \var{sa\_sigaction} usando
+ gestore del segnale come \var{sa\_sigaction} usando
\const{SA\_SIGINFO}, (vedi \secref{sec:sig_sigaction}), di rendere
- disponibili al manipolatore informazioni ulteriori informazioni riguardo il
+ disponibili al gestore informazioni ulteriori informazioni riguardo il
file che ha generato il segnale attraverso i valori restituiti in
- \type{siginfo\_t} (come vedremo in
+ \struct{siginfo\_t} (come vedremo in
\secref{sec:file_asyncronous_io}).\footnote{i due comandi \const{F\_SETSIG}
e \const{F\_GETSIG} sono una estensione specifica di Linux.}
\end{basedescript}
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 corripondenti nel
+comando \const{F\_GETFL}) è necessario estrarre i bit corrispondenti nel
\textit{file status flag} che si è ottenuto. Infatti la definizione corrente
di quest'ultimo non assegna bit separati alle tre diverse modalità
\const{O\_RDONLY}, \const{O\_WRONLY} e \const{O\_RDWR}.\footnote{in Linux
porta seriale, o le dimensioni di un framebuffer).
Per questo motivo nell'architettura del sistema è stata prevista l'esistenza
-di una funzione apposita, \func{ioctl}, con cui poter compiere le operazioni
+di una funzione apposita, \funcd{ioctl}, con cui poter compiere le operazioni
specifiche di ogni dispositivo particolare, usando come riferimento il solito
file descriptor. Il prototipo di questa funzione è:
\begin{prototype}{sys/ioctl.h}{int ioctl(int fd, int request, ...)}