Quali sono i vantaggi dell'utilizzo della pipe con nome rispetto alla pipe senza nome?


51

Stavo rivedendo una serie di domande di intervista poste da un amministratore unix; Ho trovato un argomento chiamato "named pipe".

Ho cercato su Google l'argomento; in una certa misura sono stato in grado di capirlo: - named pipe || FIFO

Ma sento ancora che mi manca la conoscenza di quando usare questo particolare tipo di tubo. Ci sono situazioni speciali in cui le pipe senza nome non funzionerebbero?


Risposte:


39

Le pipe nominate (fifo) hanno quattro tre vantaggi che posso pensare:

  • non è necessario avviare i processi di lettura / scrittura contemporaneamente
  • puoi avere più lettori / scrittori che non necessitano di antenati comuni
  • come file puoi controllare la proprietà e le autorizzazioni
  • sono bidirezionali, i tubi senza nome possono essere unidirezionali *

    *) Si pensi una shell standard |tubazione che è unidirezionale, diverse shell ( ksh, zshe bash) offrono anche coprocesses che permettono la comunicazione bidirezionale. POSIX considera le pipe come half-duplex (ovvero ogni lato può solo leggere o scrivere), la pipe()chiamata di sistema restituisce due handle di file e potrebbe essere necessario trattarne uno come sola lettura e l'altro come sola scrittura. Alcuni sistemi (BSD) supportano la lettura e la scrittura simultaneamente (non vietato da POSIX), su altri sono necessari due tubi, uno per ciascuna direzione. Controlla le tue e pipe(), popen()eventualmente popen2(), le pagine man. La non direzionalità potrebbe non dipendere dal nome della pipe o meno, sebbene su Linux 2.6 sia dipendente.

(Aggiornato, grazie al feedback di Stephane Chazelas )

Quindi un'attività immediatamente ovvia che non è possibile svolgere con una pipe senza nome è un'applicazione client / server convenzionale.

L'ultimo punto (colpito) sopra sulle pipe unidirezionali è rilevante su Linux, POSIX (vedi popen()) dice che una pipe deve essere solo leggibile o scrivibile , su Linux sono unidirezionali . Vedere Informazioni sul kernel Linux (3 ° Ed. O'Reilly) per dettagli specifici di Linux (p787). Altri sistemi operativi offrono pipe bidirezionali (senza nome).

Ad esempio, Nagios utilizza un fifo per il suo file di comando . Vari processi esterni (script CGI, controlli esterni, NRPE ecc.) Scrivono comandi / aggiornamenti a questo Fifo e questi vengono elaborati dal processo Nagios persistente.

Le pipe con nome hanno caratteristiche non diverse dalle connessioni TCP, ma ci sono differenze importanti. Poiché un fifo ha un nome di filesystem persistente che puoi scrivere anche quando non c'è un lettore, è vero che le scritture bloccheranno (senza I / O asincrono o non bloccante), anche se non perderai dati se il ricevitore non lo è avviato (o in fase di riavvio).

Per riferimento, vedere anche socket di dominio Unix e la risposta a questa domanda StackOverflow che sintetizza i principali metodi IPC e questo di cui parlapopen()


2
puoi avere anche più lettori / scrittori con pipe senza nome. Su Linux, non sono più bidirezionali della pipa senza nome. C'è una fine di scrittura e una fine di lettura e i dati scorrono in una sola direzione. Quando si apre un fifo in modalità scrittura, si ottiene la fine della scrittura, in modalità lettura la fine della lettura, in modalità rw, si scrive alla fine della scrittura e si legge dalla lettura. È diverso dalle pipe bidirezionali o dai socket di dominio unix, dove in realtà hai due flussi di dati separati in ciascuna direzione.
Stéphane Chazelas,

@StephaneChazelas grazie per il feedback, ho aggiornato la risposta per essere più specifici, e chiarisco (spero) pipe e direzionalità.
mr.spuratic,

La comunicazione con una pipe denominata comporta l'IO del disco? O è tutto in memoria? Cosa determina l'involucro delle prestazioni di questi meccanismi IPC?
CMCDragonkai

15

Le pipe anonime o anonime forniscono un mezzo di comunicazione interprocessuale one-to-one e unidirezionale tra diversi processi correlati da una relazione genitore-figlio o essendo figli di un genitore comune che fornisce la pipa, come una shell processi. Poiché i processi sono correlati, l'associazione dei descrittori di file alla pipe può essere implicita e non richiede un oggetto con un nome esterno ai processi. Una pipe senza nome esiste solo fino a quando i processori che la utilizzano mantengono descrittori di file aperti sulla pipe. Quando i processi terminano e il sistema operativo chiude tutti i descrittori di file associati ai processi, la pipe senza nome viene chiusa.

Le pipe nominate sono in realtà FIFO. Si tratta di oggetti persistenti rappresentati da nodi nel file system. Una pipe denominata fornisce una comunicazione bidirezionale a due vie tra uno o più processi che non sono necessariamente correlati e non devono necessariamente esistere contemporaneamente. Il nome del file della pipe funge da indirizzo o contratto tra i processi per la comunicazione. Se solo un processo scrive su una pipa denominata e un altro processo legge dalla pipa denominata, la pipa denominata si comporta come una pipa senza nome tra i due processi correlati.

Quindi la risposta breve è che è necessaria una pipa denominata per la comunicazione tra processi non correlati che potrebbero non esistere contemporaneamente.


+1 Penso che i processi esistano praticamente sempre allo stesso tempo (altrimenti la pipe è un po 'inutile - potresti anche lasciare cose in un file normale). Questi socket di dominio unix e vengono spesso utilizzati dai servizi demone che possono essere controllati, ad esempio, dalla riga di comando. Se guardi /runsu un sistema desktop linux probabilmente troverai alcuni di entrambi (chiamati fifos e socket unix). È una forma di IPC .
Riccioli d'oro

2
@goldilocks: una pipe denominata viene comunemente utilizzata come cassetta postale ad hoc residente in memoria tra i processi nei sistemi incorporati, in cui i processi di comunicazione sono di breve durata e non esistono contemporaneamente. Il vantaggio è la semplicità dell'implementazione rispetto alla memoria condivisa IPC e il fatto che viene utilizzata solo la RAM. Lo svantaggio è la non persistenza tra gli stivali e la natura FIFO della pipe in termini di byte rispetto alla capacità di utilizzare una struttura con memoria condivisa.
Jonathan Ben-Avraham,

@jonathan: +1, ho qualche dubbio: - perché chiamiamo pipe denominate FIFO; quali sono gli oggetti persistenti?
Ankit

@Ankit: alcune persone chiamano una pipe denominata FIFO perché si comporta come una struttura di dati FIFO, specialmente se aperta sia per la lettura che per la scrittura da un singolo processo. Per "oggetto persistente" intendevo che una pipe denominata è associata a un oggetto del file system. Cioè, è un tipo di file, con un nome, e ha la stessa persistenza di qualsiasi altro file archiviato sul supporto.
Jonathan Ben-Avraham,

4

Un vantaggio non menzionato altrove è che una pipe denominata può essere utilizzata in luoghi in cui solo un file farà.

Ad esempio, alcuni client di posta elettronica hanno la funzione di aggiungere il contenuto di ~ / .signature ad ogni messaggio di posta. Se .signature fosse un'opzione della riga di comando o se il client di posta fosse in grado di notare che .signature è eseguibile ed eseguirlo, allora non avresti bisogno di una pipe denominata. Ma se il client di posta non è così sofisticato, puoi creare una pipa denominata chiamata .signature ed eseguire un'applicazione che genera una nuova firma ogni volta che il file viene letto.


Interessante. Hai una tale domanda? Sembra che dovrebbe guardare a livello di kernel per vedere quando si accede a FIFO.
Carattere jolly

4

C'è un altro vantaggio delle named pipe: puoi usarle su diversi sistemi . Supponiamo che tu voglia la comunicazione in tempo reale di due processi in esecuzione su macchine diverse. Quindi condividi una cartella tra i due, metti il ​​tuo FIFO nella cartella e il gioco è fatto. È notevolmente più semplice che trasformare un'applicazione progettata per funzionare sui file in un servizio in ascolto su una porta.

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.