compeltate ioctl e fcntl, si passa a ... boh
authorSimone Piccardi <piccardi@gnulinux.it>
Fri, 16 Nov 2001 21:34:11 +0000 (21:34 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Fri, 16 Nov 2001 21:34:11 +0000 (21:34 +0000)
fileadv.tex
fileunix.tex

index 9d084a86285ba36c4018a419088209987e2172cd..6f192eeb0404574d31d2a2cac59e0c3bc629a11a 100644 (file)
@@ -3,7 +3,6 @@
 
 
 
 
 
 
-
 \section{I/O non bloccante}
 \label{sec:file_noblocking}
 
 \section{I/O non bloccante}
 \label{sec:file_noblocking}
 
index 4343a898bbeb31017506243f08970c2fbb6e8326..f53b821865556037e669af20d5eb5bfefeeabdea 100644 (file)
@@ -860,7 +860,7 @@ file descriptor viene usata la funzione \func{fcntl} il cui prototipo 
   \headdecl{fcntl.h}
   \funcdecl{int fcntl(int fd, int cmd)}
   \funcdecl{int fcntl(int fd, int cmd, long arg)}
   \headdecl{fcntl.h}
   \funcdecl{int fcntl(int fd, int cmd)}
   \funcdecl{int fcntl(int fd, int cmd, long arg)}
-  \funcdecl{int fcntl(int fd, int cmd, struct flock *lock)}
+  \funcdecl{int fcntl(int fd, int cmd, struct flock * lock)}
   La funzione esegue una delle possibili operazioni specificate da \param{cmd}
   sul file \param{fd}.
   
   La funzione esegue una delle possibili operazioni specificate da \param{cmd}
   sul file \param{fd}.
   
@@ -897,33 +897,60 @@ valori 
 \item[\macro{F\_SETFL}] setta il \textit{file status flag} al valore
   specificato da \param{arg}, possono essere settati solo i bit riportati
   nella terza sezione di \tabref{tab:file_open_flags} (da verificare).
 \item[\macro{F\_SETFL}] setta il \textit{file status flag} al valore
   specificato da \param{arg}, possono essere settati solo i bit riportati
   nella terza sezione di \tabref{tab:file_open_flags} (da verificare).
-\item[\macro{F\_GETLK}]
-\item[\macro{F\_SETLK}]
-\item[\macro{F\_SETLKW}]
-\item[\macro{F\_GETOWN}]
-\item[\macro{F\_SETOWN}]
-\item[\macro{F\_GETSIG}]
-\item[\macro{F\_SETSIG}]
+\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 setta 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 setta \var{errno} a \macro{EACCES} o
+  \macro{EAGAIN} (per i dettagli sul \textit{file locking} vedi
+  \secref{sec:file_locking}).
+\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 setta
+  \var{errno} a \macro{EINTR} (per i dettagli sul \textit{file locking} vedi
+  \secref{sec:file_locking}).
+\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
+  process group è restituito come valore negativo.
+\item[\macro{F\_SETOWN}] setta il processo o process group che riceverà i
+  sengali \macro{SIGIO} e \macro{SIGURG} per gli eventi associati al file
+  descriptor \var{fd}.  I process group sono settati usando valori negativi.
+\item[\macro{F\_GETSIG}] restituisce il segnale mandato quando ci sono dati
+  disponibili in input sul file descriptor. Il valore 0 indica il default (che
+  è \macro{SIGIO}), un valore diverso da zero indica il segnale richiesto,
+  (che può essere lo stesso \macro{SIGIO}), nel qual caso al manipolatore del
+  segnale, se installato con \macro{SA\_SIGINFO}, vengono rese disponibili
+  informazioni ulteriori informazioni.
+\item[\macro{F\_SETSIG}] setta il segnale da inviare quando diventa possibile
+  effettuare I/O sul file descriptor. Il valore zero indica il default
+  (\macro{SIGIO}), ogni altro valore permette di rendere disponibile al
+  manipolatore del segnale ulteriori informazioni se si è usata
+  \macro{SA\_SIGINFO}.
 \end{basedescript}
 
 \end{basedescript}
 
+La maggior parte delle funzionalità di \func{fcntl} sono troppo avanzate per
+poter essere affrontate in dettaglio a questo punto; saranno riprese più
+avanti quando affronteremo le problematiche ad esse relative.
+
 
 \subsection{La funzione \func{ioctl}}
 \label{sec:file_ioctl}
 
 Benché il concetto di \textit{everything is a file} si sia dimostratato molto
 valido anche per l'interazione con i più vari dispositivi, con cui si può
 
 \subsection{La funzione \func{ioctl}}
 \label{sec:file_ioctl}
 
 Benché il concetto di \textit{everything is a file} si sia dimostratato molto
 valido anche per l'interazione con i più vari dispositivi, con cui si può
-interagire con le stesse funzioni usate per i normali file di dati, ognuno di
-essi avrà poi delle caratteristiche peculiari, specifiche dell'hardware e
-della funzionalità che provvede, che non possono venire comprese in questa
-interfaccia astratta (un caso tipico è il settaggio della velocità di una
-porta seriale, o le dimensioni di un framebuffer).
-
-Per questo motivo fin dall'inizio è sempre stata previsto l'uso della funzione
-\func{ioctl} come un \textit{coltellino svizzero} con cui poter compiere tutte
-le operazioni specifiche e particolari di ogni singolo dispositivo. Tutto
-quello che non è possibile effettuare con le funzioni finora esaminate finisce
-per essere effettuato attraverso \func{ioctl}; il prototipo di questa funzione
-è:
+interagire con le stesse funzioni usate per i normali file di dati,
+esisteranno sempre caratteristiche peculiari, specifiche dell'hardware e della
+funzionalità che ciascuno di essi provvede, che non possono venire comprese in
+questa interfaccia astratta (un caso tipico è il settaggio della velocità di
+una porta seriale, o le dimensioni di un framebuffer).
+
+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 è:
 
 \begin{prototype}{sys/ioctl.h}{int ioctl(int fd, int request, ...)}
   
 
 \begin{prototype}{sys/ioctl.h}{int ioctl(int fd, int request, ...)}
   
@@ -933,16 +960,20 @@ per essere effettuato attraverso \func{ioctl}; il prototipo di questa funzione
   l'informazione necessaria al dispositivo.
   
   La funzione nella maggior parte dei casi ritorna 0, alcune operazioni usano
   l'informazione necessaria al dispositivo.
   
   La funzione nella maggior parte dei casi ritorna 0, alcune operazioni usano
-  però il valore di ritorno per  in caso di successo e -1
-  in caso di errore, nel qual caso \var{errno} viene settata ad uno dei
-  valori:
+  però il valore di ritorno per restituire informazoni. In caso di errore
+  viene sempre restituito -1 e \var{errno} viene settata ad uno dei valori
+  seguenti:
   \begin{errlist}
   \item \macro{ENOTTY} il file \param{fd} non è associato con un device.
   \item \macro{EINVAL} gli argomenti \param{request} o \param{argp} non sono
     validi.
   \end{errlist}
   \begin{errlist}
   \item \macro{ENOTTY} il file \param{fd} non è associato con un device.
   \item \macro{EINVAL} gli argomenti \param{request} o \param{argp} non sono
     validi.
   \end{errlist}
-  ed inoltre \macro{EBADF}
+  ed inoltre \macro{EBADF} e \macro{EFAULT}.
 \end{prototype}
 
 \end{prototype}
 
-
+La funzione serve in sostanza per fare tutte quelle operazioni che non si
+adattano all'architettura di I/O di unix e che non è possibile effettuare con
+le funzioni esaminate finora. Per questo motivo non è possibile fare altro che
+una descrizione generica; torneremo ad esaminarla in seguito, quando si
+tratterà di applicarla ad alcune problematiche specifiche.