Risposte:
Sia sui sistemi Windows che POSIX, le named pipe forniscono un modo per la comunicazione tra processi tra i processi in esecuzione sulla stessa macchina. Quello che ti danno le named pipe è un modo per inviare i tuoi dati senza avere la penalità prestazionale di coinvolgere lo stack di rete.
Proprio come un server che ascolta un indirizzo IP / porta per le richieste in arrivo, un server può anche impostare una named pipe in grado di ascoltare le richieste. In entrambi i casi, il processo client (o la libreria di accesso al DB) deve conoscere l'indirizzo specifico (o il nome della pipe) per inviare la richiesta. Spesso esiste un valore predefinito comunemente usato (molto simile alla porta 80 per HTTP, il server SQL utilizza la porta 1433 in TCP / IP; \\. \ Pipe \ sql \ query per una named pipe).
Impostando ulteriori pipe denominate, è possibile avere più server DB in esecuzione, ognuno con i propri listener di richieste.
Il vantaggio delle named pipe è che di solito è molto più veloce e libera risorse dello stack di rete.
- A proposito, nel mondo di Windows, puoi anche avere pipe con nome su macchine remote - ma in quel caso, la pipe con nome viene trasportata su TCP / IP, quindi perderai le prestazioni. Utilizzare pipe denominate per la comunicazione della macchina locale.
Unix e Windows hanno entrambi cose chiamate "Named pipe", ma si comportano diversamente. Su Unix, una pipa denominata è una strada a senso unico che in genere ha solo un lettore e uno scrittore: lo scrittore scrive e il lettore legge, capito?
Su Windows, la cosa chiamata "Named pipe" è un oggetto IPC più simile a un socket TCP: le cose possono fluire in entrambi i modi e ci sono alcuni metadati (puoi ottenere le credenziali della cosa dall'altra parte, ecc.).
Le pipe con nome Unix appaiono come file speciali nel filesystem e sono accessibili con i normali comandi IO dei file, inclusa la shell. Quelli Windows non lo fanno e devono essere aperti con una speciale chiamata di sistema (dopodiché si comportano principalmente come un normale handle win32).
Ancora più confuso, Unix ha qualcosa chiamato "socket Unix" o socket AF_UNIX, che funziona più come (ma non completamente come) un "named pipe" win32, essendo bidirezionale.
Meccanismo di comunicazione interprocesso FIFO (First In First Out) di Linux Pipes .
Tubi senza nome
sulla riga di comando, rappresentati da un "|" tra due comandi.
Named Pipes
Un file speciale FIFO. Una volta creato, puoi usare la pipe proprio come un normale file (apri, chiudi, scrivi, leggi, ecc.).
Per creare una pipe denominata, chiamata "myPipe", dalla riga di comando ( pagina man ):
mkfifo myPipe
Per creare una pipe denominata da c, dove "nome percorso" è il nome che si desidera che la pipe abbia e "mode" contiene le autorizzazioni che si desidera che la pipe abbia ( pagina man ):
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
tell()
posizionare né seek()
in una pipe.
Secondo Wikipedia :
[...] Una pipe tradizionale è "senza nome" perché esiste in forma anonima e persiste solo finché il processo è in esecuzione. Una pipe denominata è persistente del sistema ed esiste oltre la durata del processo e deve essere "scollegata" o eliminata quando non viene più utilizzata. I processi generalmente si collegano alla pipe denominata (di solito appare come un file) per eseguire IPC (comunicazione tra processi).
Confrontare
echo "test" | wc
per
mkdnod apipe p
wc apipe
wc bloccherà fino a
echo "test" > apipe
esegue
Le pipe sono un modo di trasmettere dati tra applicazioni. Sotto Linux lo uso sempre per trasmettere l'output di un processo in un altro. Questo è anonimo perché l'app di destinazione non ha idea da dove provenga quel flusso di input. Non è necessario.
Una pipa denominata è solo un modo per agganciarsi attivamente a una pipa esistente e recuperare i suoi dati. È per situazioni in cui il provider non sa quali client mangeranno i dati.
Questo è un esempio di Technet (quindi non so perché la risposta contrassegnata dice che le pipe denominate sono più veloci ??):
Named Pipes vs. TCP / IP Sockets
In un ambiente LAN (Local Area Network) veloce, i client socket e protocolli TCP / IP (Transmission Control Protocol) sono comparabili per quanto riguarda le prestazioni. Tuttavia, la differenza di prestazioni tra i client Socket TCP / IP e i client Named Pipes diventa evidente con reti più lente, come le reti WAN (Wide Area Network) o le reti dial-up. Ciò è dovuto ai diversi modi in cui i meccanismi di comunicazione tra processi (IPC) comunicano tra pari.
Per le pipe con nome, le comunicazioni di rete sono in genere più interattive. Un peer non invia i dati fino a quando un altro peer non lo richiede utilizzando un comando di lettura. Una lettura di rete in genere comporta una serie di messaggi di pipì denominati prima di iniziare a leggere i dati. Questi possono essere molto costosi in una rete lenta e causare un traffico di rete eccessivo , che a sua volta influisce su altri client di rete.
È anche importante chiarire se si parla di pipe locali o di pipe di rete. Se l'applicazione server è in esecuzione localmente sul computer che esegue un'istanza di SQL Server, il protocollo Named Pipes locale è un'opzione. Le pipe con nome locale vengono eseguite in modalità kernel ed è molto veloce.
Per i socket TCP / IP, le trasmissioni di dati sono più snelle e hanno un sovraccarico minore. Le trasmissioni di dati possono inoltre sfruttare i meccanismi di miglioramento delle prestazioni dei socket TCP / IP come finestre, riconoscimenti ritardati e così via. Questo può essere molto utile in una rete lenta. A seconda del tipo di applicazioni, tali differenze di prestazioni possono essere significative.
I socket TCP / IP supportano anche una coda di backlog. Ciò può fornire un effetto di livellamento limitato rispetto alle pipe denominate che potrebbero causare errori di pipe-traffic quando si tenta di connettersi a SQL Server.
In genere, TCP / IP è preferito in una rete LAN, WAN o dial-up lenta, mentre le named pipe possono essere una scelta migliore quando la velocità della rete non è un problema, in quanto offre più funzionalità, facilità d'uso e opzioni di configurazione.
Comunicazione tra processi (principalmente) per applicazioni Windows. Simile all'utilizzo dei socket per comunicare tra le applicazioni in Unix.
Le pipe nominate in un contesto unix / linux possono essere usate per far comunicare due diverse shell poiché una shell non può condividere nulla con un'altra.
Inoltre, uno script creato due volte nella stessa shell non può condividere nulla attraverso le due istanze. Ho trovato un uso per le named pipe durante la codifica di un demone che contiene la funzione start () e stop () e volevo usare lo stesso script per eseguire le due azioni.
Senza named pipe (o qualsiasi tipo di semaforo) avviare lo script in background non è un problema. Il fatto è che quando finisce non puoi accedere all'istanza in background.
Quindi, quando si desidera inviargli il comando stop, non è possibile: eseguire lo stesso script senza named pipe e chiamare la funzione stop () non farà nulla poiché si esegue effettivamente un'altra istanza.
La soluzione era implementare due pipe, una READ e l'altra WRITE all'avvio del demone. Quindi costringilo, tra le altre sue attività, ad ascoltare il tubo READ. Quindi la funzione Stop () contiene un comando che scriverà un messaggio nella pipe, che sarà gestito dallo script in esecuzione in background che eseguirà un'uscita 0. In questo modo la nostra seconda istanza dello stesso script ha solo attività da svolgere: dire alla prima istanza di fermarsi.
In questo modo un solo script può avviarsi e arrestarsi.
Naturalmente hai diversi modi per farlo innescando la fermata tramite un tocco, ad esempio. Ma questo è bello e interessante da codificare.
Named pipe è un sistema Windows per la comunicazione tra processi. Nel caso del server SQL, se il server si trova sullo stesso computer del client, è possibile utilizzare le named pipe per trasferire i dati, anziché TCP / IP.