From: Simone Piccardi Date: Fri, 16 Nov 2001 21:34:11 +0000 (+0000) Subject: compeltate ioctl e fcntl, si passa a ... boh X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=4139a4ccddbab5f6b60fc2f28fedba0795c747df compeltate ioctl e fcntl, si passa a ... boh --- diff --git a/fileadv.tex b/fileadv.tex index 9d084a8..6f192ee 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -3,7 +3,6 @@ - \section{I/O non bloccante} \label{sec:file_noblocking} diff --git a/fileunix.tex b/fileunix.tex index 4343a89..f53b821 100644 --- a/fileunix.tex +++ b/fileunix.tex @@ -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)} - \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}. @@ -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\_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} +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ò -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, ...)} @@ -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 - 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} - ed inoltre \macro{EBADF}, + ed inoltre \macro{EBADF} e \macro{EFAULT}. \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.