Pipes nomeados de socket VS de domínio Unix?

122

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)?


fonte
1
@GregHewgill: infelizmente essa questão é mais sobre "o que é IPC" do que a diferença que estou perguntando: /. Eu vi isso antes de postar, deveria ter vinculado e dito que está relacionado? (não foi útil para mim)
1
@acid: Sim, vincular perguntas relacionadas e explicar quais dúvidas você ainda tem é sempre uma boa ideia.
Ben Voigt
3
Este artigo resumiu muito bem. Desmistificando os soquetes de domínio Unix: thomasstover.com/uds.html
Cong Ma
Link quebrado: techdeviancy.com/uds.html
mcdado

Respostas:

106

Os soquetes de domínio UNIX são geralmente mais flexíveis do que os canais nomeados. Algumas de suas vantagens são:

  • Você pode usá-los para mais de dois processos de comunicação (por exemplo, um processo de servidor com potencialmente vários processos de cliente se conectando);
  • Eles são bidirecionais;
  • Eles suportam a passagem de credenciais UID / GID verificadas pelo kernel entre processos;
  • Eles suportam a passagem de descritores de arquivo entre processos;
  • Eles suportam modos de pacote e pacote sequenciado.

Para usar muitos desses recursos, você precisa usar a send()/ recv()família de chamadas do sistema em vez de write()/ read().

caf
fonte
11
Por outro lado, talvez deva ser dito que os pipes de nomes têm a vantagem de poderem ser "conectados a" via 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.
Dolda2000
66

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.

outubro
fonte
1
hmm interessante +1. Você por acaso sabe qual é a diferença entre bytestream e datagrama? Talvez um exemplo em uma ou duas sentença como você já fez para esta pergunta?
7
@acidzombie: Um pipe ou socket no modo datagrama mantém os limites, para que uma writechamada produza uma readchamada. 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)
Ben Voigt
1
@BenVoigt bem, a entrega de pacotes de soquete de datagrama não é confiável, então uma gravação não gerará necessariamente uma chamada de leitura. Talvez para sockets locais, mas isso não fica claro em seu comentário. Portanto, independentemente disso, há problemas.
xaxxon 01 de
3
@xaxxon: Ambos os pipes e os soquetes de domínio unix são locais, portanto, sem perdas, o receptor está esvaziando suas filas.
Ben Voigt
6
Sim, ao contrário do UDP, os soquetes de domínio do Unix de datagrama são garantidos , entrega no pedido.
jtchitty