\caption{Schema della architettura dell'accesso ai file attraverso
l'interfaccia dei \textit{file descriptor}}
\label{fig:file_proc_file}
\caption{Schema della architettura dell'accesso ai file attraverso
l'interfaccia dei \textit{file descriptor}}
\label{fig:file_proc_file}
\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
\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
- \item[\macro{ESPIPE}] \var{fd} è una pipe, un socket o una fifo.
- \item[\macro{EINVAL}] \var{whence} non è un valore valido.
+ \item[\macro{ESPIPE}] \param{fd} è una pipe, un socket o una fifo.
+ \item[\macro{EINVAL}] \param{whence} non è un valore valido.
-La nuova posizione è settata usando il valore specificato da \var{offset},
-sommato al riferimento dato da \var{whence}; quest'ultimo può assumere i
+La nuova posizione è settata usando il valore specificato da \param{offset},
+sommato al riferimento dato da \param{whence}; quest'ultimo può assumere i
seguenti valori\footnote{per compatibilità con alcune vecchie notazioni
questi valori possono essere rimpiazzati rispettivamente con 0, 1 e 2 o con
\macro{L\_SET}, \macro{L\_INCR} e \macro{L\_XTND}}:
seguenti valori\footnote{per compatibilità con alcune vecchie notazioni
questi valori possono essere rimpiazzati rispettivamente con 0, 1 e 2 o con
\macro{L\_SET}, \macro{L\_INCR} e \macro{L\_XTND}}:
kernel (cioè \var{f\_pos} in \var{file}, vedi \figref{fig:file_proc_file}).
Dato che la funzione ritorna la nuova posizione, usando il valore zero per
kernel (cioè \var{f\_pos} in \var{file}, vedi \figref{fig:file_proc_file}).
Dato che la funzione ritorna la nuova posizione, usando il valore zero per
-\func{offset} si può riottenere la posizione corrente nel file chiamando la
-funzione con \func{lseek(fd, 0, SEEK\_CUR}.
+\param{offset} si può riottenere la posizione corrente nel file chiamando la
+funzione con \code{lseek(fd, 0, SEEK\_CUR}.
Si tenga presente inoltre che usare \macro{SEEK\_END} non assicura affatto che
successiva scrittura avvenga alla fine del file, infatti se questo è stato
Si tenga presente inoltre che usare \macro{SEEK\_END} non assicura affatto che
successiva scrittura avvenga alla fine del file, infatti se questo è stato
come vedremo in \secref{sec:sock_io_behav}), o per certi dispositivi, come le
unità a nastro, che restituiscono un singolo blocco di dati alla volta.
come vedremo in \secref{sec:sock_io_behav}), o per certi dispositivi, come le
unità a nastro, che restituiscono un singolo blocco di dati alla volta.
-In realtà anche le due condizioni segnalate dagli errori \func{EINTR} e
-\func{EAGAIN} non sono errori. La prima si verifica quando la \func{read} è
+In realtà anche le due condizioni segnalate dagli errori \macro{EINTR} e
+\macro{EAGAIN} non sono errori. La prima si verifica quando la \func{read} è
bloccata in attesa di dati in ingresso e viene interrotta da un segnale; in
tal caso l'azione da prendere è quella di rieseguire la funzione. Torneremo
sull'argomento in \secref{sec:signal_xxx}.
bloccata in attesa di dati in ingresso e viene interrotta da un segnale; in
tal caso l'azione da prendere è quella di rieseguire la funzione. Torneremo
sull'argomento in \secref{sec:signal_xxx}.
funzione di controllo dei file \func{fnctl} (che esamineremo in
\secref{sec:file_fcntl}) con il parametro \macro{F\_DUPFD}.
funzione di controllo dei file \func{fnctl} (che esamineremo in
\secref{sec:file_fcntl}) con il parametro \macro{F\_DUPFD}.
come valore per \param{newfd} diventa equivalente a \func{dup}. La sola
differenza, a parte i codici di errore, è che \func{dup2} chiude il nuovo file
se è già aperto mentre \func{fcntl} apre il primo disponibile con un valore
come valore per \param{newfd} diventa equivalente a \func{dup}. La sola
differenza, a parte i codici di errore, è che \func{dup2} chiude il nuovo file
se è già aperto mentre \func{fcntl} apre il primo disponibile con un valore
L'uso principale di queste funzioni è per la redirezione dell'input e
dell'output fra l'esecuzione di una \func{fork} e la successiva \func{exec};
diventa così possibile associare un file (o una pipe) allo standard input o
L'uso principale di queste funzioni è per la redirezione dell'input e
dell'output fra l'esecuzione di una \func{fork} e la successiva \func{exec};
diventa così possibile associare un file (o una pipe) allo standard input o
Per questo motivo l'architettura del sistema ha previsto l'esistenza di una
funzione speciale, \func{ioctl}, con cui poter compiere operazioni specifiche
per ogni singolo dispositivo. Il prototipo di questa funzione è:
Per questo motivo l'architettura del sistema ha previsto l'esistenza di una
funzione speciale, \func{ioctl}, con cui poter compiere operazioni specifiche
per ogni singolo dispositivo. Il prototipo di questa funzione è:
Manipola il dispositivo sottostante, usando il parametro \param{request} per
specificare l'operazione richiesta e il terzo parametro (usualmente di tipo
\param{char * argp}) per il trasferimento dell'informazione necessaria.
Manipola il dispositivo sottostante, usando il parametro \param{request} per
specificare l'operazione richiesta e il terzo parametro (usualmente di tipo
\param{char * argp}) per il trasferimento dell'informazione necessaria.
che darne una descrizione generica; torneremo ad esaminarla in seguito, quando
si tratterà di applicarla ad alcune problematiche specifiche.
che darne una descrizione generica; torneremo ad esaminarla in seguito, quando
si tratterà di applicarla ad alcune problematiche specifiche.