Jakie są nazwy rur?

Czym są i jak działają?

Context happens to be SQL Server

Author: Gilles, 2008-10-06

10 answers

Zarówno w systemach Windows, jak i POSIX, named-pipes umożliwia komunikację między procesami, która ma miejsce pomiędzy procesami działającymi na tej samej maszynie. To, co named pipes daje, to sposób na wysyłanie danych bez konieczności ponoszenia kary za zaangażowanie stosu sieciowego.

Tak jak masz serwer nasłuchujący adresu IP/portu dla przychodzących żądań, serwer może również skonfigurować nazwany pipe, który może nasłuchiwać żądań. W obu przypadkach proces klienta (lub dostęp DB biblioteka) musi znać konkretny adres (lub nazwę rury), aby wysłać żądanie. Często istnieje powszechnie używany standard domyślny (podobnie jak port 80 dla HTTP, SQL server używa portu 1433 w TCP / IP;\\.\pipe\SQL \ query for a named pipe).

Poprzez ustawienie dodatkowych nazwanych rur, możesz mieć uruchomione wiele serwerów DB, każdy z własnymi słuchaczami żądań.

Zaletą nazwanych rur jest to, że zwykle jest znacznie szybszy i zwalnia zasoby stosu sieciowego.

-- BTW, w Windows world, Możesz również mieć nazwane rury do zdalnych maszyn -- ale w takim przypadku, nazwany rura jest transportowany przez TCP / IP, więc stracisz wydajność. Użyj nazwanych rur do lokalnej komunikacji maszynowej.

 126
Author: Toybuilder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-06 23:01:57

Unix i Windows mają rzeczy zwane "nazwanymi rurami" , ale zachowują się inaczej. Na Unixie nazwana rura to jednokierunkowa ulica, która zazwyczaj ma tylko jednego czytelnika i jednego pisarza - pisarz pisze, a czytelnik czyta, rozumiesz?

W systemie Windows rzecz o nazwie "Named pipe" jest obiektem IPC bardziej jak gniazdo TCP - rzeczy mogą przepływać w obie strony i są pewne metadane(możesz uzyskać poświadczenia rzeczy na drugim końcu itp.).

Unix o nazwie pipes pojawia się jako specjalny plik w systemie plików i może być dostępny za pomocą zwykłych komend IO plików, w tym powłoki. Te z Windows nie, i muszą być otwierane za pomocą specjalnego wywołania systemowego (po czym zachowują się głównie jak normalny uchwyt win32).

Jeszcze bardziej mylące jest to, że Unix ma coś, co nazywa się "Unix socket" lub af_unix socket, które działa bardziej jak (ale nie do końca jak) win32 "named pipe", będąc dwukierunkowym.

 35
Author: MarkR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-06 20:51:08

Linux Pipes
Mechanizm komunikacji międzyprocesowej First in First Out (FIFO).

Nienazwane Rury
W wierszu poleceń, reprezentowany przez " / " pomiędzy dwoma poleceniami.

Nazwane Rury
Specjalny plik FIFO. Po utworzeniu można używać potoku tak jak zwykłego pliku (otwierać, zamykać, zapisywać, odczytywać itp.).

Aby utworzyć rurę o nazwie "myPipe" z linii poleceń (strony podręcznika):

mkfifo myPipe  

Aby utworzyć nazwaną rurę w c, gdzie "pathname" jest nazwą, którą chcesz mieć w potoku, a "mode" zawiera uprawnienia, które chcesz mieć w potoku (strona podręcznika):

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
 21
Author: John Mulder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-06 18:44:04

Według Wikipedii :

[...] Tradycyjna rura jest "nienazwana", ponieważ istnieje anonimowo i trwa tylko tak długo, jak Proces jest uruchomiony. Nazwa rury jest system-trwałe i istnieje poza żywotnością procesu i musi być "unlinked" lub usunięte, gdy nie jest już używany. Procesy zazwyczaj dołączają się do nazwanego potoku (Zwykle pojawiającego się jako plik), aby wykonać IPC (inter-process communication).

 16
Author: Jonathan Lonowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-06 18:33:08

Porównaj

echo "test" | wc

Do

mkdnod apipe p
wc apipe

Wc będzie blokować do

echo "test" > apipe

Wykonuje

 8
Author: John Nilsson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-06 18:38:24

Rury są sposobem przesyłania strumieniowego danych między aplikacjami. Pod Linuksem używam tego przez cały czas do przesyłania strumieniowego danych wyjściowych jednego procesu do drugiego. Jest to anonimowe, ponieważ aplikacja docelowa nie ma pojęcia, skąd pochodzi ten strumień wejściowy. Nie musi.

A o nazwie rura jest tylko sposobem aktywnego podłączenia do istniejącej rury i przechwytywania jej danych. Jest to dla sytuacji, w których dostawca nie wie, co klienci będą jeść dane.

 5
Author: Oli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-06 18:33:47

Komunikacja między procesami (głównie) dla aplikacji Windows. Podobne do używania gniazd do komunikacji między aplikacjami w Uniksie.

MSDN

 5
Author: Ken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-06 18:40:50

Nazwane rury w kontekście unix / linux mogą być używane do tworzenia dwóch różnych powłok do komunikacji, ponieważ powłoka po prostu nie może dzielić się niczym z inną.

Co więcej, jeden skrypt utworzony dwukrotnie w tej samej powłoce nie może udostępniać niczego przez te dwie instancje. Znalazłem zastosowanie nazwanych rur podczas kodowania demona zawierającego funkcje start () i stop() i chciałem użyć tego samego skryptu do wykonania dwóch akcji.

Bez nazwanych rur (lub jakiegokolwiek semafora) uruchomienie skryptu w tle nie stanowi problemu. Chodzi o to, że gdy się skończy, po prostu nie możesz uzyskać dostępu do instancji w tle.

Więc kiedy chcesz wysłać mu komendę stop, po prostu nie możesz: uruchomienie tego samego skryptu bez nazwanych rur i wywołanie funkcji stop() nic nie da, ponieważ faktycznie uruchamiasz inną instancję.

Rozwiązaniem było zaimplementowanie dwóch rur, jednego odczytu, a drugiego zapisu podczas uruchamiania demona. Następnie uczynić go, wśród jego innych zadań, posłuchaj rury do czytania. Następnie funkcja Stop() zawiera polecenie, które napisze wiadomość w potoku, która będzie obsługiwana przez działający w tle skrypt, który wykona wyjście 0. W ten sposób nasza druga instancja tego samego skryptu ma tylko zadanie do wykonania: powiedz pierwszej instancji, aby się zatrzymała.

W ten sposób jeden i tylko jeden skrypt może się uruchomić i zatrzymać.

Oczywiście masz różne sposoby, aby to zrobić, uruchamiając stop za pomocą dotyku na przykład. Ale ten jest ładny i interesujące do kodowania.

 3
Author: Nicolas Mas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-14 04:25:26

To jest exeprt z technetu (więc nie wiem dlaczego zaznaczona odpowiedź mówi, że nazwane rury są szybsze??):

Nazwane rury A gniazda TCP / IP

W środowisku szybkiej sieci lokalnej (LAN) gniazda protokołu kontroli transmisji/protokołu internetowego (TCP/IP) i klientów nazwanych rur są porównywalne pod względem wydajności. Jednak różnica w wydajności między gniazdami TCP / IP a nazwanymi Klientami Pipes staje się widoczna w wolniejszych sieciach, na przykład w szerokim obszarze sieci (WAN) lub sieci dial-up. Wynika to z różnych sposobów komunikacji międzyprocesowej (IPC) między rówieśnikami.

W przypadku nazwanych rur komunikacja sieciowa jest zazwyczaj bardziej interaktywna. Peer nie wysyła danych, dopóki inny peer nie poprosi o nie za pomocą polecenia read. Odczyt sieci zazwyczaj wiąże się z serią komunikatów Peek o nazwie pipes, zanim zacznie odczytywać dane. Mogą one być bardzo kosztowne w powolnej sieci i powodować nadmierną sieć ruch , który z kolei wpływa na innych klientów sieci.

Ważne jest również wyjaśnienie, czy mówimy o lokalnych rurach lub rurach sieciowych. Jeśli aplikacja serwerowa jest uruchomiona lokalnie na komputerze, na którym działa instancja SQL Server, opcjonalnym jest lokalny protokół Pipes. Local named pipes działa w trybie jądra i jest bardzo szybki.

W przypadku gniazd TCP / IP transmisja danych jest bardziej uproszczona i ma mniej obciążeń. Transmisja danych może również zaleta mechanizmów poprawy wydajności gniazd TCP / IP, takich jak windowing, opóźnione potwierdzenia i tak dalej. Może to być bardzo pomocne w powolnej sieci. W zależności od rodzaju aplikacji, takie różnice wydajności mogą być znaczące.

Gniazda TCP / IP obsługują również kolejkę zaległości. Może to zapewnić ograniczony efekt wygładzania w porównaniu z nazwanymi rurami, co może prowadzić do błędów zajętych rurami podczas próby połączenia z serwerem SQL.

Generalnie preferowany jest TCP / IP w powolnej sieci LAN, WAN lub dial-up, podczas gdy nazwane rury mogą być lepszym wyborem, gdy szybkość sieci nie jest problemem, ponieważ oferuje większą funkcjonalność, łatwość użycia i opcje konfiguracji.

 3
Author: Ness,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-03 09:59:46

Named pipes jest systemem windows do komunikacji między procesami. W przypadku SQL server, jeżeli serwer znajduje się na tej samej maszynie co klient, wtedy do przesyłania danych można użyć nazwanych rur, w przeciwieństwie do protokołu TCP/IP.

 1
Author: eulerfx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-06 18:34:13