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 pipes e funcionam bem como dispositivos de caracteres . Para operações que não estão lendo e gravando (como o controle de fluxo em uma linha serial), o dispositivo fornece comandos ad-hoc chamados ioctl .
Alguns dispositivos são muito parecidos com arquivos regulares: eles são feitos de um número finito de bytes, e o que você escreve em uma determinada posição pode mais tarde ser lido na mesma posição. Esses dispositivos são chamados de dispositivos de bloqueio .
As interfaces de rede são mais complexas: o que 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 inconveniente: presumivelmente, cada chamada para write
enviaria um pacote, e cada chamada para read
receberia um pacote (e se o buffer é muito pequeno para o pacote se encaixar, o pacote seria perdido).
As interfaces de rede podem existir como dispositivos que fornecem apenas ioctl
. Na verdade, isso é o que algumas variantes 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 preocupam com interfaces de rede individuais, eles trabalham em um nível mais alto. Por exemplo, um navegador da Web deseja estabelecer conexões TCP e um servidor da Web deseja ouvir conexões TCP. Para esse propósito, o que seria útil é 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
Na verdade, ksh e bash fornecem essa interface para clientes TCP e UDP. Em geral, no entanto, os aplicativos de rede são mais complexos do que os aplicativos de acesso a arquivos. Embora a maioria das trocas de dados seja realizada com chamadas análogas a read
e write
, estabelecer a conexão requer mais informações do que apenas um nome de arquivo. Por exemplo, a escuta de conexões TCP é executada em duas etapas: uma para ser executada quando o servidor começa a escutar e uma para ser executada toda vez que um cliente se conecta. Essas etapas extras não se encaixam bem na API do arquivo, que é a principal razão pela qual a rede tem sua própria API.
Outra classe de dispositivos que normalmente não tem entradas em /dev
no Linux (mas em algumas outras variantes unix) são os adaptadores de vídeo. Em princípio, adaptadores de vídeo simples podem ser expostos como dispositivos framebuffer , que podem ser dispositivos de blocos feitos de blocos que representam a cor de cada pixel. Os adaptadores de vídeo acelerados podem ser representados como dispositivos de caracteres nos 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 ao kernel sempre que exibisse algo. O que acontece em vez disso é que o servidor X escreve principalmente diretamente na memória do adaptador de vídeo, porque é mais rápido.