Su molti dispositivi, le operazioni principali sono l'invio di byte dal computer a una periferica o la ricezione di byte da una periferica del computer. Tali dispositivi sono simili ai tubi e funzionano bene come dispositivi a caratteri . Per le operazioni che non leggono e scrivono (come il controllo del flusso su una linea seriale), il dispositivo fornisce comandi ad hoc chiamati ioctl .
Alcuni dispositivi sono molto simili ai normali file: sono costituiti da un numero finito di byte e ciò che scrivi in una determinata posizione può in seguito essere letto dalla stessa posizione. Questi dispositivi sono chiamati dispositivi a blocchi .
Le interfacce di rete sono più complesse: ciò che leggono e scrivono non sono byte ma pacchetti. Mentre sarebbe ancora possibile utilizzare la solita interfaccia con read
e write
, sarebbe imbarazzante: presumibilmente ogni chiamata a write
avrebbe inviato un pacchetto e ogni chiamata a read
avrebbe ricevuto un pacchetto (e se il buffer è troppo piccolo per adattarsi al pacchetto, il pacchetto andrebbe perso).
Le interfacce di rete potrebbero esistere solo come dispositivi che forniscono ioctl
. In effetti, questo è ciò che fanno alcune varianti di unix, ma non Linux. C'è qualche vantaggio in questo approccio; ad esempio, su Linux, le interfacce di rete potrebbero sfruttare udev . Ma i vantaggi sono limitati, motivo per cui non è stato fatto.
La maggior parte delle applicazioni relative alla rete non si preoccupano delle singole interfacce di rete, ma funzionano a un livello superiore. Ad esempio, un browser Web desidera stabilire connessioni TCP e un server Web desidera ascoltare le connessioni TCP. A tal fine, ciò che sarebbe utile sono dispositivi per protocolli di rete di alto livello, ad es
{ echo $'GET http://www.google.com/ HTTP/1.0\r';
echo $'Host: www.google.com\r';
echo $'\r' >&0; cat; } <>/dev/tcp/www.google.com/80
In effetti ksh e bash forniscono una tale interfaccia per i client TCP e UDP. In generale, tuttavia, le applicazioni di rete sono più complesse delle applicazioni che accedono ai file. Mentre la maggior parte degli scambi di dati avviene con chiamate analoghe a read
e write
, stabilire la connessione richiede più informazioni di un semplice nome di file. Ad esempio, l'ascolto delle connessioni TCP richiede due passaggi: uno da eseguire all'avvio dell'ascolto del server e uno da eseguire ogni volta che un client si connette. Tali passaggi extra non si adattano bene all'API dei file, che è il motivo principale per cui la rete ha una propria API.
Un'altra classe di dispositivi che in genere non ha voci /dev
su Linux (ma su alcune altre varianti unix) sono gli adattatori video. In linea di principio, semplici adattatori video potrebbero essere esposti come dispositivi framebuffer , che potrebbero essere dispositivi a blocchi costituiti da blocchi che rappresentano il colore di ciascun pixel. Gli adattatori video accelerati potrebbero essere rappresentati come dispositivi a caratteri su cui le applicazioni inviano comandi. Qui, lo svantaggio dell'interfaccia del dispositivo è che è lento: l'applicazione di visualizzazione (in pratica un server X) dovrebbe effettuare chiamate del kernel ogni volta che visualizza qualcosa. Quello che succede invece è che il server X per lo più scrive direttamente nella memoria della scheda video, perché è più veloce.