Vorrei conoscere non solo le differenze lato utente, ma anche le differenze/parti comuni nell'implementazione del kernel Linux.C'è qualche differenza tra socketpair e una coppia di pipe senza nome?
risposta
tubi sono unidirezionali, quindi è necessario due tubi di avere una comunicazione bidirezionale, mentre un socketpair è bidirezionale.
le pipe sono sempre orientate al flusso, mentre le prese possono essere orientate ai datagrammi.
le prese sono normali prese
AF_UNIX
, il che significa che è possibile passare su di essi messaggi ausiliari comeSCM_RIGHTS
eSCM_CREDENTIALS
.
Nel kernel, le pipe sono implementate nel codice del file system e nelle schede socket nel codice di rete.
Le funzioni shutdown()
e SCM_RIGHTS
sono necessarie per implementare comunicazioni a prova di gara con sottoprocessi in un programma multithread.
I tubi possono essere duplicati accidentalmente nel caso in cui più thread pipe()
e fork()
allo stesso tempo; in tal caso, l'estremità di scrittura del tubo potrebbe non essere mai chiusa e EOF potrebbe non avviarsi mai sul lato letto, causando un deadlock. Anche per quei programmi che utilizzano fork()
per sottoprocessi solo (vale a dire tutti i fork()
s vengono prontamente seguiti da execve()
nel bambino), cattura il tubo da un concorrente fork()
gare ancora con l'impostazione del bit FD_CLOEXEC
, salvo l'uso della chiamata di sistema pipe2()
non portabile Linux che accetta O_CLOEXEC
.
Risolvendo questo pericolo in modo portatile, anche per i programmi che fork()
senza quindi chiamando execve()
, comporta socketpairs:
- Per un canale in uscita (ad esempio, la scrittura del programma principale al sottoprocesso): utilizzare un socketpair anziché pipe e chiama
shutdown()
prima delclose()
dal genitore per causare una condizione EOF a prova di gara, indipendentemente dal fatto che il descrittore di file sia stato duplicato. - Per un canale in entrata (ovvero la lettura dal sottoprocesso), creare una pipe nel child (in modo che la fine della scrittura non sia mai visibile nel padre per la duplicazione accidentale) e inviare solo la fine di lettura al padre su una socketpair con un messaggio
SCM_RIGHTS
.
Penso che anche le schede socket supportino letture parziali e pipe no. – poolie
C'è qualche differenza di prestazioni tra di loro? – C2H5OH