Existe um arquivo para cada soquete?

19

"Tudo é um arquivo" no mundo do UNIX.

A frase acima é famosa. Quando executo echo "hello programmer" >> /dev/tty1 , posso observar a string dada em TeleType 1 , ....

O que e onde é o arquivo por cada 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?

    
por PersianGulf 23.02.2014 / 17:04

3 respostas

9

man 7 unix:

The AF_UNIX (also known as AF_LOCAL) socket family is used to communicate between processes on the same machine efficiently. Traditionally, UNIX domain sockets can be either unnamed, or bound to a file system pathname (marked as being of type socket). Linux also supports an abstract namespace which is independent of the file system.

Ou seja. nem todo socket pode ser visto como um arquivo (no sentido de "nenhum arquivo sem um nome de arquivo").

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

    
por 23.02.2014 / 17:18
36

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:

Arquivos como pipes 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 é totalmente verdade: um processo que tem um pipe ou soquete (ou qualquer outro arquivo) aberto pode transmiti-lo para outros processos através de um soquete Unix; isso é conhecido como descritor de arquivo passando .)

Sockets que possuem um nome (seja no sistema de arquivos ou resumo) podem ser abertos usando esse nome. Os soquetes de rede podem ser abertos (ou conectados de forma mais precisa) remotamente de qualquer máquina que tenha conectividade apropriada.

    
por 24.02.2014 / 02:08
13

What and where is file per each socket?

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

Como menciona Hauke Laging, soquetes "unix local" têm um nó de arquivo, assim como os pipes nomeados (veja man fifo ). No entanto, os soquetes de protocolo da Internet (usados para comunicação de rede) não. Em vez disso, eles estão associados no espaço do usuário com 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 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 numéricos separados .

Então, nesse sentido, todos os sockets são muito parecidos com arquivos, e possuem um link em /proc/[pid]/fd/ . Você pode até mesmo chamar readlink() neste inode e obter um tipo especial de nome de arquivo, que é usado em ferramentas de linha de comando como lsof , acredito; Da mesma forma, você pode obter informações sobre o descritor de soquete via fstat() .

    
por 23.02.2014 / 17:22