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?
Odpowiedzi:
Nazwane potoki (fifo) mają
czterytrzy zalety, o których mogę myśleć:są dwukierunkowe, rury bez nazwy mogą być jednokierunkowe*(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 o
popen()
źródło
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.
źródło
/run
na system stacjonarny z linuksem, prawdopodobnie znajdziesz kilka z nich (o nazwach fifos i unix). To forma IPC .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.
źródło
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.
źródło