Em muitos dispositivos, as principais operações são enviar bytes do computador para um periférico ou receber bytes de um periférico no computador. Esses dispositivos são semelhantes aos tubos e funcionam bem como dispositivos de caracteres . Para operações que não estão lendo e gravando (como controle de fluxo em uma linha serial), o dispositivo fornece comandos ad-hoc chamados ioctl .
Alguns dispositivos são muito parecidos com arquivos comuns: são feitos de um número finito de bytes, e o que você escreve em uma determinada posição pode ser lido posteriormente na mesma posição. Esses dispositivos são chamados de dispositivos de bloco .
As interfaces de rede são mais complexas: o que eles lêem e escrevem não são bytes, mas pacotes. Embora ainda fosse possível usar a interface usual com read
e write
, seria estranho: presumivelmente, cada chamada write
enviaria um pacote e cada chamada read
receberia um pacote (e se o buffer for muito pequeno para o pacote caber, o pacote seria perdido).
As interfaces de rede podem existir apenas como dispositivos que fornecem ioctl
. De fato, é isso que algumas variantes do unix fazem, mas não o Linux. Há alguma vantagem nessa abordagem; por exemplo, no Linux, as interfaces de rede podem aproveitar o udev . Mas as vantagens são limitadas, e é por isso que não foi feito.
A maioria dos aplicativos relacionados à rede não se importa com interfaces de rede individuais, eles trabalham em um nível superior. Por exemplo, um navegador da web deseja fazer conexões TCP e um servidor da web deseja escutar conexões TCP. Para esse propósito, o que seria útil são dispositivos para protocolos de rede de alto nível, por exemplo
{ 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 fato, o ksh e o bash fornecem essa interface para clientes TCP e UDP. Em geral, no entanto, os aplicativos de rede são mais complexos que os aplicativos de acesso a arquivos. Enquanto trocas maioria dos dados são realizadas com chamadas análogas read
e write
, estabelecendo a conexão requer mais informação do que apenas um nome de arquivo. Por exemplo, a escuta de conexões TCP requer duas etapas: uma a ser executada quando o servidor começa a escutar e outra a cada vez que um cliente se conecta. Essas etapas extras não se encaixam bem na API do arquivo, que é o principal motivo pelo qual a rede possui sua própria API.
Outra classe de dispositivos que normalmente não possui entradas no /dev
Linux (mas possui outras variantes do Unix) são os adaptadores de vídeo. Em princípio, adaptadores de vídeo simples podem ser expostos como dispositivos buffer de quadro , que podem ser dispositivos de bloco feitos de blocos que representam a cor de cada pixel. Os adaptadores de vídeo acelerados podem ser representados como dispositivos de caracteres para os quais os aplicativos enviam comandos. Aqui, a desvantagem da interface do dispositivo é que ela é lenta: o aplicativo de exibição (na prática, um servidor X) precisaria fazer chamadas do kernel sempre que exibir alguma coisa. O que acontece é que o servidor X grava principalmente diretamente na memória do adaptador de vídeo, porque é mais rápido.