En muchos dispositivos, las operaciones principales son enviar bytes desde la computadora a un periférico, o recibir bytes desde un periférico en la computadora. Dichos dispositivos son similares a las tuberías y funcionan bien como dispositivos de caracteres . Para las operaciones que no leen ni escriben (como el control de flujo en una línea en serie), el dispositivo proporciona comandos ad-hoc llamados ioctl .
Algunos dispositivos son muy parecidos a los archivos normales: están formados por un número finito de bytes, y lo que escribes en una posición determinada se puede leer más tarde desde la misma posición. Estos dispositivos se llaman dispositivos de bloque .
Las interfaces de red son más complejas: lo que leen y escriben no son bytes sino paquetes. Si bien aún sería posible usar la interfaz habitual con read
y write
, sería incómodo: presumiblemente, cada llamada a write
enviaría un paquete, y cada llamada a read
recibiría un paquete (y si el búfer es demasiado pequeño para que el paquete se ajuste, el paquete se perdería).
Las interfaces de red podrían existir como dispositivos que solo proporcionan ioctl
. De hecho, esto es lo que hacen algunas variantes de Unix, pero no Linux. Hay alguna ventaja en este enfoque; por ejemplo, en Linux, las interfaces de red podrían aprovechar udev . Pero las ventajas son limitadas, por lo que no se ha hecho.
La mayoría de las aplicaciones relacionadas con la red no se preocupan por las interfaces de red individuales, funcionan a un nivel superior. Por ejemplo, un navegador web quiere hacer conexiones TCP, y un servidor web quiere escuchar conexiones TCP. Para este propósito, lo que sería útil son los dispositivos para protocolos de red de alto nivel, p. Ej.
{ 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
De hecho, ksh y bash proporcionan dicha interfaz para clientes TCP y UDP. En general, sin embargo, las aplicaciones de red son más complejas que las aplicaciones de acceso a archivos. Si bien la mayoría de los intercambios de datos se realizan con llamadas análogas a read
y write
, establecer la conexión requiere más información que solo un nombre de archivo. Por ejemplo, la escucha de conexiones TCP tiene dos pasos: uno que se realiza cuando el servidor comienza a escuchar y otro que se realiza cada vez que un cliente se conecta. Estos pasos adicionales no encajan bien en la API del archivo, que es la razón principal por la que las redes tienen su propia API.
Otra clase de dispositivos que generalmente no tienen entradas en /dev
Linux (pero sí en algunas otras variantes de Unix) son los adaptadores de video. En principio, los adaptadores de video simples podrían exponerse como dispositivos framebuffer , que podrían ser dispositivos de bloques hechos de bloques que representan el color de cada píxel. Los adaptadores de video acelerados podrían representarse como dispositivos de caracteres a los cuales las aplicaciones envían comandos. Aquí, el inconveniente de la interfaz del dispositivo es que es lenta: la aplicación de visualización (en la práctica, un servidor X) necesitaría hacer llamadas al núcleo cada vez que se muestre algo. En cambio, lo que sucede es que el servidor X escribe principalmente directamente en la memoria del adaptador de video, porque es más rápido.