Depois de olhar para um soquete de nome unix e eu pensei que eles eram chamados de tubos. Eu olhei para os nomes dos tubos e não vi muita diferença. Eu vi que eles foram inicializados de forma diferente, mas isso é a única coisa que eu noto. Ambos usam a função de escrita / leitura C e funcionam da mesma forma AFAIK.
Qual é a diferença entre soquetes de domínio unix e pipes nomeados? Quando eu escolheria um em vez do outro? Qual devo usar por padrão (como como eu uso o vetor por padrão em C ++ do que usar deque, list ou qualquer outra coisa se eu tiver necessidades)?
Respostas:
Os soquetes de domínio UNIX são geralmente mais flexíveis do que os canais nomeados. Algumas de suas vantagens são:
Para usar muitos desses recursos, você precisa usar a
send()
/recv()
família de chamadas do sistema em vez dewrite()
/read()
.fonte
open(2)
chamadas , o que os torna mais adequados para a construção de pipelines ad-hoc entre programas que normalmente aceitam apenas argumentos de nome de arquivo.Uma diferença é que os pipes nomeados são unilaterais, portanto, você precisará usar dois deles para fazer a comunicação bidirecional. É claro que os soquetes são bidirecionais. Parece um pouco mais complicado usar duas variáveis em vez de uma (ou seja, dois tubos em vez de um soquete).
Além disso, o artigo da Wikipedia é bastante claro no seguinte ponto : "Os soquetes de domínio Unix podem ser criados como fluxos de bytes ou sequências de datagramas, enquanto os canais são apenas fluxos de bytes."
Os pipes nomeados são, na verdade, bidirecionais, mas semiduplex . Isso significa que a comunicação pode ir da extremidade A para a extremidade B ou de B para A, mas nunca as duas ao mesmo tempo.
fonte
write
chamada produza umaread
chamada. No modo de fluxo, os dados podem ser concatenados em um longo fluxo, portanto, muitas gravações podem ser lidas de uma vez ou vice-versa. (O Windows tem tubos de datagrama, de acordo com a resposta de jtoberon, o Unix não)