Existe um arquivo para cada soquete?

21

"Tudo é um arquivo" no mundo UNIX.

A frase acima é famosa. Quando corro echo "hello programmer" >> /dev/tty1, posso ver a sequência especificada em TeleType 1 ....

O que e onde está o arquivo para cada um socket? Suponha que meu amigo se conecte ao meu PC e seu IP seja h.h.h.h: como posso acessar o respectivo arquivo? É possível?

PersianGulf
fonte
3
A API do soquete é na verdade um desvio da "política Unix" a esse respeito, porque originalmente veio do BSD . Observe que sempre há o Plano 9 do Bell Labs, que é "mais Unix que Unix" - mesmo as APIs de rede e de gráficos são arquivos lá.
Ntskrnl
soquetes e processos são mencionados uma quantidade razoável nos documentos do Plano 9, principalmente falando sobre onde o modelo UNIX deu errado.
strugee

Respostas:

9

homem 7 unix:

A família de soquetes AF_UNIX (também conhecida como AF_LOCAL) é usada para se comunicar entre processos na mesma máquina com eficiência. Tradicionalmente, os soquetes de domínio UNIX podem ser sem nome ou vinculados a um nome de caminho do sistema de arquivos (marcado como sendo do tipo soquete). O Linux também suporta um espaço para nome abstrato que é independente do sistema de arquivos.

Ou seja, nem todos os soquetes podem ser vistos como um arquivo (no sentido de "nenhum arquivo sem um nome de arquivo").

Mas existem arquivos com listas de soquetes (por exemplo /proc/net/tcp); não exatamente o que "tudo é um arquivo" significa, no entanto.

Hauke ​​Laging
fonte
38

Um soquete é um arquivo. Mas nem todos os arquivos têm nomes. Aqui estão alguns exemplos de arquivos que não têm nomes:

  • Qualquer arquivo que costumava ter um nome e agora é excluído, mas ainda é aberto por um programa.
  • Um sem nome tubulação , como aquele criado pelo |operador shell.
  • A maioria dos soquetes : qualquer soquete da Internet ou soquete Unix que não esteja no espaço de nome do sistema de arquivos (pode estar no espaço de nome abstrato ou sem nome).

Arquivos como tubos ou soquetes não nomeados são criados por um processo e só podem ser acessados ​​nesse processo ou em processos filhos criados posteriormente. (Isso não é completamente verdade: um processo que possui um tubo ou soquete (ou qualquer outro arquivo) aberto pode transmiti-lo para outros processos via soquete Unix; isso é conhecido como passagem do descritor de arquivo .)

Soquetes que têm um nome (seja no sistema de arquivos ou no resumo) podem ser abertos usando esse nome. Os soquetes de rede podem ser abertos (ou conectados com mais precisão) remotamente a partir de qualquer máquina que possua conectividade apropriada.

Gilles 'SO- parar de ser mau'
fonte
Essa é a resposta correta.
Jforberg 27/08
4
/proc/<pid>/fd/*e /proc/net/*pode ser interessante
n611x007
Aceite esta resposta. É IMHO muito mais preciso.
User1202136
13

O que e onde está o arquivo por cada soquete?

"Tudo" é um exagero. Não é uma política rígida, é apenas uma prática comum usar o sistema de arquivos para interfaces, pois o acesso ao sistema de arquivos é sinônimo de chamadas do sistema (ou seja, o sistema de arquivos é realmente uma interface com o kernel e, portanto, fornece um formato conveniente para todos os tipos de coisas) . Outros sistemas operacionais não fazem tanto uso disso, por isso é considerado um recurso distintivo.

Como menciona Hauke ​​Laging, os soquetes "unix local" têm um nó de arquivo, assim como pipes nomeados (consulte man fifo). No entanto, soquetes de protocolo da Internet (usados ​​para comunicação em rede) não. Em vez disso, eles são associados no espaço do usuário a um número de porta. Observe que um soquete de servidor em uma única porta conecta vários clientes, cada um com seu próprio soquete individual (um único arquivo de soquete local unix também pode ser usado dessa maneira com um servidor, ou seja, pode haver vários soquetes associados ao mesmo endereço de arquivo) e no código eles são de fato identificados individualmente através de descritores de arquivos numéricos separados .

Portanto, nesse sentido, todos os soquetes são muito parecidos com arquivos e têm um link /proc/[pid]/fd/. Você pode até chamar readlink()esse inode e obter um tipo especial de nome de arquivo, que é usado nas ferramentas de linha de comando, como lsofeu acredito; da mesma forma, você pode obter informações sobre o descritor de soquete via fstat().

Cachinhos Dourados
fonte
Você quer dizer "identificado no espaço do usuário por seu inode"? Nem todo soquete possui um número de porta e pode haver vários soquetes para o mesmo número de porta (embora não faça sentido).
Hauke ​​Laging
@HaukeLaging: Bom ponto. Eu editei para tornar isso mais claro a partir do segundo parágrafo.
24514 goldilocks