"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?
Respostas:
homem 7 unix:
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.fonte
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:
|
operador shell.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.
fonte
/proc/<pid>/fd/*
e/proc/net/*
pode ser interessante"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é chamarreadlink()
esse inode e obter um tipo especial de nome de arquivo, que é usado nas ferramentas de linha de comando, comolsof
eu acredito; da mesma forma, você pode obter informações sobre o descritor de soquete viafstat()
.fonte