soquetes usam APIs diferentes
Isso não é inteiramente verdade. Existem algumas funções adicionais para uso com soquetes, mas você pode usar, por exemplo, normal read()
e write()
em um soquete fd.
como esse "Tudo é um arquivo" se aplica aqui?
No sentido de que um descritor de arquivo está envolvido.
Se sua definição de "arquivo" é uma sequência discreta de bytes armazenados em um sistema de arquivos, nem tudo é um arquivo. No entanto, se sua definição de arquivo for mais semelhante a um identificador - um canal de informações, ou seja, uma conexão de E / S -, então "tudo é um arquivo" começa a fazer mais sentido. Essas coisas inevitavelmente envolvem seqüências de bytes, mas de onde elas vêm ou vão podem diferir contextualmente.
No entanto, não é realmente planejado literalmente. Um daemon não é um arquivo, um daemon é um processo; mas se você estiver executando o IPC, seu método de se relacionar com outro processo poderá ser mitigado pelas entidades de estilo de arquivo.
"Tudo é um arquivo" é apenas um exagero. Era uma novela na década de 1970 e era uma característica distintiva primária do UNIX. Mas é apenas um conceito de marketing, não uma base real do UNIX, porque obviamente não é verdade. Não é benéfico ou sensato tratar TUDO como um arquivo.
CPU é um arquivo? Seu programa lê () uma CPU para obter uma nova instrução? RAM é um arquivo? Seu programa lê () o próximo byte?
Naquela época, havia tipos de SO que forneciam uma API para um disquete e uma API diferente para um disco rígido, uma API diferente para fita magnética e várias APIs diferentes para terminais diferentes e assim por diante. Os sistemas de mainframe IBM tinham diferentes tipos de arquivos em discos rígidos e forneceram uma API diferente para cada um deles, acredite ou não! Portanto, a abordagem "é um arquivo" do UNIX, juntamente com a abordagem "stdin / stdout / stderr", trouxe uma abstração muito elegante para usuários e programadores.
Com a rede, essa abstração em particular simplesmente não deu certo. E não há mal, apenas um pouco menos elegância e coerência geral do sistema operacional. Mas funciona. Você vê um arquivo chamado
/dev/myinternetz/www/google/com/tcp/80
em qualquer lugar do seu sistema hoje? Você pode abrir (), escrever () uma consulta e ler () a resposta em bom HTML? Não? Isso ocorre porque a abstração "é um arquivo" não foi muito útil para interagir na rede. Não funcionaria muito bem na prática. Lei das abstrações com vazamentos em ação.fonte
/dev/tcp/www.google.com/80
. Porém, não é um arquivo real - o bash está apenas fingindo./dev/mem
ou/dev/kmem
se quiser.Soquetes são arquivos. Você pode usar
read
ewrite
em um soquete: eles são equivalentes a chamadasrecv
esend
comflags=0
. Você fechá-los comclose
. Você pode movê-los comdup
amigos e se precisar embaralhar os descritores de arquivos. Você pode definir alguns sinalizadores comfcntl
e usar o buffer stdio após a chamadafdopen
. A lista continua. Muito importante, você pode chamarselect
epoll
usar qualquer tipo de arquivo, incluindo soquetes, para que essas funções permitam que um programa seja bloqueado até receber entrada por qualquer meio, simplesmente listando descritores de arquivo.Existem chamadas de sistema extras para alguns tipos de soquete (
recv
esend
,shutdown
etc.), como há uma chamada de sistema extra para dispositivos (ioctl
).Nem todos os arquivos têm nomes e, dentre os que possuem, eles nem sempre vivem na estrutura de diretórios. Tubos criados por
pipe
( por exemplo, em um pipeline de shell) e soquetes criados porsocketpair
não têm nomes, mas ainda são arquivos. Soquetes criados porsocket
possuem um nome cuja sintaxe depende do domínio. Este nome é passado em umstruct sockaddr
parabind
e outras funções. Para umAF_UNIX
soquete Unix ( ), o nome é astruct sockaddr_un
, que é uma família e uma string; dependendo da string, esse pode ser um nome de arquivo (soquetes nomeados podem ser criados commknod
muitas variantes do unix) ou não (o namespace abstrato). Para umAF_INET
soquete IPv4 ( ), o nome é astruct sockaddr_in
, contendo um número de porta e endereço IP, alémprotocol
do dasocket
chamada.fonte
Se você
stat
usar um soquete, verá que ele possui um número de inode e outras características dos arquivos regulares, então eu o classificaria como um arquivo no sistema de arquivos. Exemplo:17/11. Informações adicionais para Linux (ext3): Um soquete possui um inode (que é um bloco de 256 bytes no disco), mas não possui nenhum bloco de dados (você pode verificar isso extraindo o inode e examinando os ponteiros do bloco de dados; ou por executando debugfs 'stat' que mostra um Blockcount de 0). Portanto, ele possui metadados de arquivo (proprietário, grupo, permissões etc.), mas nenhum conteúdo de dados no disco. Isso é idêntico a um arquivo vazio comum (
touch /tmp/foo
) que também possui uma contagem de blocos igual a 0. No primeiro caso, o campo "type" no inode mostra "socket"; no segundo caso, mostra "arquivo regular".Referências: estrutura ext2 inode ;
stat
,dumpe2fs
Edebugfs
comandos.fonte
file
oustat
tornar um arquivo.