Jakie są zalety używania nazwanego potoku nad nienazwanym potokiem?

51

Przeglądałem zestaw pytań do wywiadu zadawanych przez administratora unixa; Znalazłem temat o nazwie „nazwany potok”.

Przejrzałem ten temat; w pewnym stopniu byłem w stanie to zrozumieć: - nazwane rury || FIFO

Ale nadal czuję, że brakuje mi wiedzy, kiedy użyć tego konkretnego rodzaju rury. Czy są jakieś specjalne sytuacje, w których nienazwane rury nie działałyby?

Ankit
źródło
Kolejny link na forum technicznym: writeulearn.com/category/inter-process-communicationipc

Odpowiedzi:

39

Nazwane potoki (fifo) mają cztery trzy zalety, o których mogę myśleć:

  • nie musisz jednocześnie zaczynać procesów odczytu / zapisu
  • możesz mieć wielu czytelników / pisarzy, którzy nie potrzebują wspólnego pochodzenia
  • jako plik możesz kontrolować własność i uprawnienia
  • są dwukierunkowe, rury bez nazwy mogą być jednokierunkowe *

    *) Uważa standardowego powłoka |rurociągu, który jest jednokierunkowy, kilka misek ( ksh, zshi bash) również coprocesses które umożliwiają komunikację dwukierunkową. POSIX traktuje potoki jako półdupleks (tzn. Każda strona może tylko czytać lub zapisywać), pipe()wywołanie systemowe zwraca dwa uchwyty plików i może być konieczne traktowanie jednego jako tylko do odczytu, a drugiego jako tylko do zapisu. Niektóre systemy (BSD) obsługują jednoczesny odczyt i zapis (nie jest to zabronione przez POSIX), na innych potrzebne byłyby dwie rury, po jednej dla każdego kierunku. Sprawdzić pipe(), popen()i ewentualnie popen2()stron man. Niekierunkowość może nie zależeć od tego, czy potok jest nazwany czy nie, chociaż w Linuksie 2.6 jest zależny.

(Zaktualizowano, dzięki opinii Stephane Chazelas )

Tak więc jednym natychmiast oczywistym zadaniem, którego nie można wykonać za pomocą nienazwanego potoku, jest konwencjonalna aplikacja klient / serwer.

Ostatni (dotknięty) punkt powyżej dotyczący potoków jednokierunkowych jest istotny w systemie Linux, POSIX (patrz popen()) mówi, że potok musi być tylko do odczytu lub zapisu , w Linuksie są one jednokierunkowe . Zobacz Understanding The Linux Kernel (3rd Ed. O'Reilly), aby uzyskać szczegółowe informacje na temat systemu Linux (p787). Inne systemy operacyjne oferują potoki dwukierunkowe (nienazwane).

Na przykład Nagios używa pliku fifo do pliku poleceń . Różne procesy zewnętrzne (skrypty CGI, kontrole zewnętrzne, NRPE itp.) Piszą polecenia / aktualizacje do tego fifo i są one przetwarzane przez trwały proces Nagios.

Nazwane potoki mają funkcje podobne do połączeń TCP, ale istnieją ważne różnice. Ponieważ fifo ma trwałą nazwę systemu plików, którą możesz zapisać do niej, nawet gdy nie ma czytnika, co prawda zapisy będą blokować (bez asynchronicznych lub nieblokujących operacji we / wy), chociaż nie stracisz danych, jeśli odbiornik nie jest rozpoczęty (lub jest ponownie uruchamiany).

W celach informacyjnych zobacz także gniazda domenowe systemu Unix i odpowiedź na to pytanie Stackoverflow, które podsumowuje główne metody IPC , oraz to, które mówi opopen()

pan. spuratic
źródło
2
możesz też mieć wielu czytelników / pisarzy z nienazwanymi potokami. W systemie Linux nie są one bardziej dwukierunkowe niż nieokreślony potok. Jest koniec do pisania i koniec do odczytu, a dane przepływają tylko w jednym kierunku. Kiedy otworzysz fifo w trybie zapisu, otrzymasz koniec pisania, w trybie odczytu koniec czytania, w trybie rw piszesz do końca pisania i czytasz z czytania. Różni się to od dwukierunkowych potoków lub gniazd domeny unix, gdzie faktycznie masz dwa oddzielne przepływy danych w każdym kierunku.
Stéphane Chazelas,
@StephaneChazelas dzięki za opinie, zaktualizowałem odpowiedź, aby była bardziej szczegółowa i wyjaśniła (mam nadzieję) potoki i kierunkowość.
mr. Spuratic
Czy komunikacja z nazwanym potokiem wymaga IO dysku? A może to wszystko w pamięci? Co decyduje o kopercie wydajności tych mechanizmów IPC?
CMCDragonkai
15

Anonimowe lub anonimowe potoki zapewniają środki bezpośredniej komunikacji jednokierunkowej między różnymi procesami powiązanymi przez relację rodzic-dziecko lub przez bycie dziećmi wspólnego rodzica, który zapewnia potok, taki jak powłoka proces. Ponieważ procesy są ze sobą powiązane, powiązanie deskryptorów plików z potokiem może być niejawne i nie wymaga obiektu o nazwie zewnętrznej dla procesów. Nienazwany potok istnieje tylko tak długo, jak procesy, które go używają, utrzymują otwarte deskryptory plików dla potoku. Gdy procesy zakończą się, a system operacyjny zamknie wszystkie deskryptory plików związane z procesami, potok bez nazwy zostanie zamknięty.

Nazwane rury są w rzeczywistości FIFO. Są to trwałe obiekty reprezentowane przez węzły w systemie plików. Nazwany potok zapewnia dwukierunkową komunikację wiele do wielu między jednym lub większą liczbą procesów, które niekoniecznie są powiązane i nie muszą istnieć w tym samym czasie. Nazwa pliku potoku służy jako adres lub umowa między procesami komunikacji. Jeśli tylko jeden proces zapisuje do nazwanego potoku, a inny proces odczytuje z nazwanego potoku, wówczas nazwany potok zachowuje się tak samo jak potok bez nazwy między dwoma powiązanymi procesami.

Krótka odpowiedź brzmi więc, że potrzebujesz nazwanego potoku do komunikacji między niepowiązanymi procesami, które mogą nie istnieć w tym samym czasie.

Jonathan Ben-Avraham
źródło
+1 Myślę, że procesy prawie zawsze istnieją w tym samym czasie (w przeciwnym razie potok jest trochę bezcelowy - równie dobrze możesz po prostu zostawić rzeczy w zwykłym pliku). Te i domeny uniksowe są często używane przez usługi demonów, którymi można sterować, np. Z poziomu wiersza poleceń. Jeśli spojrzysz /runna system stacjonarny z linuksem, prawdopodobnie znajdziesz kilka z nich (o nazwach fifos i unix). To forma IPC .
goldilocks,
2
@goldilocks: Nazwany potok jest powszechnie używany jako rezydująca w pamięci skrzynka pocztowa ad-hoc między procesami w systemach osadzonych, w których procesy komunikacyjne są krótkotrwałe i nie istnieją w tym samym czasie. Zaletą jest prostota implementacji w porównaniu do IPC z pamięcią współużytkowaną oraz fakt, że używana jest tylko pamięć RAM. Wadą jest brak trwałości między bootami i bajtową naturą potoku FIFO w porównaniu z możliwością użycia struktury ze wspólną pamięcią.
Jonathan Ben-Avraham
@jonathan: +1, mam pewne wątpliwości: - dlaczego nazywamy nazwane potoki FIFO; czym są trwałe obiekty?
Ankit,
@Ankit: Niektóre osoby nazywają nazwany potok FIFO, ponieważ zachowuje się on jak struktura danych FIFO, szczególnie gdy jest otwarty zarówno do odczytu, jak i zapisu przez pojedynczy proces. Przez „trwały obiekt” rozumiałem, że nazwany potok jest powiązany z obiektem systemu plików. Oznacza to, że jest to typ pliku o nazwie i ma taką samą trwałość jak każdy inny plik przechowywany na nośniku.
Jonathan Ben-Avraham
4

Zaletą niewymienioną gdzie indziej jest to, że nazwany potok może być używany w miejscach, w których wystarczy tylko plik.

Na przykład niektórzy klienci poczty e-mail mają funkcję dołączania zawartości ~ / .signature do każdej wiadomości e-mail. Jeśli .signature było opcją wiersza polecenia lub jeśli klient poczty mógł zauważyć, że .signature jest wykonywalny i uruchomić go, to nie potrzebujesz nazwanego potoku. Ale jeśli klient poczty nie jest tak zaawansowany, możesz utworzyć nazwany potok o nazwie .signature i uruchomić aplikację, która generuje nowy podpis za każdym razem, gdy plik jest czytany.

Eyal
źródło
Ciekawy. Czy masz taką aplikację? Wygląda na to, że będzie musiał obserwować na poziomie jądra, aby zobaczyć, kiedy uzyskiwany jest dostęp do FIFO.
Wildcard
4

Jest jeszcze jedna zaleta nazwanych potoków: możesz ich używać w różnych systemach . Załóżmy, że potrzebujesz komunikacji w czasie rzeczywistym dwóch procesów działających na różnych komputerach. Następnie udostępnij folder między nimi, umieść FIFO w folderze i gotowe. Jest to znacznie łatwiejsze niż przekształcenie aplikacji przeznaczonej do pracy z plikami w usługę nasłuchującą na porcie.

MariusMatutiae
źródło