Por que interfaces de rede não estão em / dev como outros dispositivos?

61

Estou mais curioso, mas por que as interfaces de rede não estão em / dev? Existem outros tipos de dispositivos que não são representados como um nó em / dev?

    
por andyortlieb 24.10.2011 / 19:19

4 respostas

36

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.

    
por 02.11.2011 / 01:19
9

A forma de "Transport Transport Interface" (TLI) da AT & T / Solaris de fazer rede TCP / IP possui arquivos especiais como "/ dev / tcp" ou "/ dev / udp". O programador abre esse arquivo especial para obter um soquete de uma família de protocolos apropriada. Eu acho que é por isso que você tem que ter "-lnsl" ao compilar um programa que usa sockets no Solaris: por baixo de tudo é TLI.

    
por 24.10.2011 / 22:17
9

Você pode encontrá-lo no diretório /sys/class/net . it O link simbólico para outro arquivo em /sys/device/../../ , a seguir é a saída da minha máquina virtual (kernel do Linux 3.10). E você pode usar o comando udevadm info <filename> para examinar seu atributo

lrwxrwxrwx. 1 root root 0 Apr  3 13:38 ens33 -> ../../devices/pci0000:00/0000:00:11.0/0000:02:01.0/net/ens33
    
por 04.04.2015 / 07:58
3

Embora tradicionalmente o Linux não tenha sido totalmente compatível com o posix, quanto mais seguir qualquer tipo de padrão do Open Group (além de talvez o LSB). Houve tentativas de transferir mais funcionalidades do UNIX para o Linux.

O Glendix é um desses projetos que oferece uma porta do sistema de arquivos virtual / net do Plan9, que permite que você faça exatamente como descreve.

Sistema de arquivos Plan9 Port / net para Linux

    
por 10.08.2013 / 22:18

Tags