+La funzione serve in sostanza come meccanismo generico per fare tutte quelle
+operazioni che non rientrano nell'interfaccia ordinaria della gestione dei
+file e che non è possibile effettuare con le funzioni esaminate finora. La
+funzione richiede che si passi come primo argomento un file descriptor
+regolarmente aperto, e l'operazione da compiere viene selezionata attraverso
+il valore dell'argomento \param{request}. Il terzo argomento dipende
+dall'operazione prescelta; tradizionalmente è specificato come \code{char *
+ argp}, da intendersi come puntatore ad un area di memoria
+generica,\footnote{all'epoca della creazione di questa funzione infatti ancora
+ non era stato introdotto il tipo \ctype{void}.} ma per certe operazioni può
+essere omesso, e per altre è un semplice intero.
+
+Normalmente la funzione ritorna zero in caso di successo e $-1$ in caso di
+errore, ma per alcune operazione il valore di ritorno, che nel caso viene
+impostato ad un valore positivo, può essere utilizzato come parametro di
+uscita. È più comune comunque restituire i risultati all'indirizzo puntato dal
+terzo argomento.
+
+Data la genericità dell'interfaccia non è possibile classificare in maniera
+sistematica le operazioni che si possono gestire con \func{ioctl}, un breve
+elenco di alcuni esempi di esse è il seguente:
+\begin{itemize*}
+\item il cambiamento dei font di un terminale.
+\item l'esecuzione di una traccia audio di un CDROM.
+\item i comandi di avanti veloce e riavvolgimento di un nastro.
+\item il comando di espulsione di un dispositivo rimovibile.
+\item l'impostazione della velocità trasmissione di una linea seriale.
+\item l'impostazione della frequenza e della durata dei suoni emessi dallo
+ speaker.
+\end{itemize*}
+
+In generale ogni dispositivo ha un suo insieme di operazioni specifiche
+effettuabili attraverso \func{ioctl}, tutte queste sono definite nell'header
+file \file{sys/ioctl.h}, e devono essere usate solo sui dispositivi cui fanno
+riferimento. Infatti anche se in genere i valori di \param{request} sono
+opportunamente differenziati a seconda del dispositivo\footnote{il kernel usa
+ un apposito \textit{magic number} per distinguere ciascun dispositivo nella
+ definizione delle macro da usare per \param{request}, in modo da essere
+ sicuri che essi siano sempre diversi, ed il loro uso per dispositivi diversi
+ causi al più un errore. Si veda il capitolo quinto di \cite{LinDevDri} per
+ una trattazione dettagliata dell'argomento.} così che la richiesta di
+operazioni relative ad altri dispositivi usualmente provoca il ritorno della
+funzione con una condizione di errore, in alcuni casi, relativi a valori
+assegnati prima che questa differenziazione diventasse pratica corrente, si
+potrebbero usare valori validi anche per il dispositivo corrente, con effetti
+imprevedibili o indesiderati.
+
+Data la assoluta specificità della funzione, il cui comportamento varia da
+dispositivo a dispositivo, non è possibile fare altro che dare una descrizione
+sommaria delle sue caratteristiche; torneremo ad esaminare in
+seguito\footnote{per l'uso di \func{ioctl} con i socket si veda
+ sez.~\ref{sec:sock_ctrl_func}.} quelle relative ad alcuni casi specifici (ad
+esempio la gestione dei terminali è effettuata attraverso \func{ioctl} in
+quasi tutte le implementazioni di Unix), qui riportiamo solo l'elenco delle
+operazioni che sono definite per i file ordinari, caratterizzate dal prefisso
+\texttt{FIO}:
+\begin{basedescript}{\desclabelwidth{2.0cm}}
+\item[\const{FIOCLEX}] imposta il flag di \itindex{close-on-exec}
+ \textit{close-on-exec} sul file, in questo caso, essendo usata come
+ operazione logica, \func{ioctl} non richiede un terzo argomento.
+\item[\const{FIONCLEX}] cancella il flag di \itindex{close-on-exec}
+ \textit{close-on-exec} sul file, in questo caso, essendo usata come
+ operazione logica, \func{ioctl} non richiede un terzo argomento.
+\item[\const{FIOASYNC}] abilita la modalità di I/O asincrono sul file (vedi
+ sez.~\ref{sec:file_asyncronous_operation}); il terzo argomento deve essere
+ un puntatore ad un intero (cioè di tipo \texttt{const int *}).
+\item[\const{FIONBIO}] abilita sul file l'I/O in modalità non bloccante; il
+ terzo argomento deve essere un puntatore ad un intero (cioè di tipo
+ \texttt{const int *}).
+\item[\const{FIOSETOWN}] imposta il processo che riceverà i segnali
+ \const{SIGURG} e \const{SIGIO} generati sul file; il terzo argomento deve
+ essere un puntatore ad un intero (cioè di tipo \texttt{const int *}) il cui
+ valore specifica il PID del processo.
+\item[\const{FIOGETOWN}] legge il processo che riceverà i segnali
+ \const{SIGURG} e \const{SIGIO} generati sul file; il terzo argomento deve
+ essere un puntatore ad un intero (cioè di tipo \texttt{int *}) su cui sarà
+ scritto il PID del processo.
+\item[\const{FIONREAD}] legge il numero di byte disponibili in lettura sul
+ file descriptor;\footnote{questa operazione è disponibile solo su alcuni
+ file descriptor, in particolare sui socket (vedi
+ sez.~\ref{sec:sock_ioctl_IP}) o sui file descriptor di \textit{epoll}
+ (vedi sez.~\ref{sec:file_epoll}).} il terzo argomento deve essere un
+ puntatore ad un intero (cioè di tipo \texttt{int *}) su cui sarà restituito
+ il valore.
+%\item[\const{FIOQSIZE}] che cavolo è ? Get exact space used by quota.
+\end{basedescript}
+
+