socket di dominio unix VS named pipe?


122

Dopo aver esaminato un socket con nome unix e ho pensato che fossero chiamati pipe. Ho guardato i nomi dei pipe e non ho visto molta differenza. Ho visto che sono stati inizializzati in modo diverso, ma questa è l'unica cosa che noto. Entrambi usano la funzione di scrittura / lettura C e funzionano allo stesso modo AFAIK.

Qual è la differenza tra socket di dominio unix e named pipe? Quando ne sceglierei uno sull'altro? Quale dovrei usare di default (come il modo in cui uso il vettore per impostazione predefinita in C ++ piuttosto che usare deque, list o qualsiasi altra cosa se ho bisogno)?

c  linux 

1
@ GregHewgill: sfortunatamente questa domanda è più "cos'è IPC" piuttosto che la differenza che sto chiedendo: /. Ho visto che prima di postare, avrei dovuto collegare e dire che è correlato? (non è stato utile per me)

1
@acid: Sì, collegare le domande correlate e spiegare quale domanda hai ancora è sempre una buona idea.
Ben Voigt

3
Questo articolo lo riassume abbastanza bene. Demistificazione dei socket di dominio Unix: thomasstover.com/uds.html
Cong Ma

Link interrotto: techdeviancy.com/uds.html
mcdado

Risposte:


106

I socket di dominio UNIX sono generalmente più flessibili delle pipe denominate. Alcuni dei loro vantaggi sono:

  • È possibile utilizzarli per più di due processi in comunicazione (ad es. Un processo server con potenzialmente più processi client connessi);
  • Sono bidirezionali;
  • Supportano il passaggio di credenziali UID / GID verificate dal kernel tra i processi;
  • Supportano il passaggio di descrittori di file tra processi;
  • Supportano le modalità pacchetto e pacchetto sequenziale.

Per utilizzare molte di queste funzioni, è necessario utilizzare la send()/ recv()famiglia di chiamate di sistema, piuttosto che write()/ read().


11
D'altra parte, si dovrebbe forse dire che le pipe dei nomi hanno il vantaggio di poter essere "collegate" tramite open(2)chiamate ordinarie , il che le rende più adatte per la costruzione di pipeline ad-hoc tra programmi che normalmente accettano solo argomenti di nomi di file.
Dolda2000

66

Una differenza è che le pipe con nome sono unidirezionali, quindi dovrai usarne due per fare una comunicazione bidirezionale. Le prese ovviamente sono a due vie. Sembra leggermente più complicato usare due variabili invece di una (cioè due pipe invece di un socket).

Inoltre, l'articolo di wikipedia è abbastanza chiaro sul punto seguente : "I socket di dominio Unix possono essere creati come flussi di byte o sequenze di datagrammi, mentre le pipe sono solo flussi di byte."


I tubi denominati sono, infatti, bidirezionali ma half-duplex . Ciò significa che la comunicazione può andare dall'estremità A all'estremità B o da B ad A, ma mai entrambe allo stesso tempo.


1
hmm interessante +1. Sai per caso qual è la differenza tra bytestream e datagram? Forse esempio in una frase o due come hai già fatto per questa domanda?

7
@acidzombie: una pipe o un socket in modalità datagramma mantiene i limiti, in modo che una writechiamata produca una readchiamata. In modalità flusso i dati possono essere concatenati insieme in un lungo flusso, quindi molte scritture possono essere lette contemporaneamente, o viceversa. (Windows ha datagram pipe, secondo la risposta di jtoberon Unix no)
Ben Voigt

1
@ BenVoigt bene, la consegna del pacchetto del socket del datagramma non è affidabile, quindi una scrittura non genererà necessariamente una chiamata di lettura. Forse per prese locali, ma non è chiaro dal tuo commento. Quindi a prescindere ha problemi.
xaxx il

3
@xaxxon: sia i pipe che i socket del dominio unix sono locali, quindi il ricevitore è privo di perdite e sta svuotando le sue code.
Ben Voigt

6
Sì, a differenza di UDP, i socket del dominio Unix del datagramma sono garantiti , consegna in ordine.
jtchitty
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.