Movatterモバイル変換


[0]ホーム

URL:


Przejdź do zawartości
Wikipediawolna encyklopedia
Szukaj

Potok (Unix)

Z Wikipedii, wolnej encyklopedii

Potok (ang. pipe) – jeden z mechanizmówkomunikacji międzyprocesowej umożliwiający wymianę danych pomiędzy dwomaprocesami. Odbywa się to najczęściej poprzez połączeniestandardowego wyjścia jednego procesu zestandardowym wejściem drugiego.

Historia

[edytuj |edytuj kod]

Mechanizm potoku i jego notacja (pionowa linia) zostały wymyślone przezDouglasa McIlroya, jednego z autorów wczesnych powłok systemowych po tym, jak zaobserwował, że w wielu przypadkach wyjście jednego programu stanowiło wejście dla drugiego. Jego pomysł został zaimplementowany w 1973 roku, przezKena Thompsona w systemie operacyjnymUNIX[1]. Mechanizm potoku został następnie dodany w innychsystemach operacyjnych, takich jakDOS,OS/2,Microsoft Windows iBeOS, często z tą samą notacją.


Potoki procesowe

[edytuj |edytuj kod]

Wuniksowychpowłokach systemowych używa się symbolu „|” (pionowej linii), aby połączyć dwa lub więcej procesów w potok.

Przykład wykorzystania potoków w systemieUNIX:

$ps-a|sort|uniq|grep-vsh

Powyższa konstrukcja zwróci listę uruchomionych procesów (ps-a), posortowaną alfabetycznie (sort), niezawierającą powtórzeń (uniq), oraz bez linii zawierających wzorzec sh (grep-vsh).

Do stworzenia nienazwanego potoku służywywołanie systemowepipe(). Prototyp funkcji bibliotecznej znajduje się w pliku nagłówkowymunistd.h i ma następującą postać:

intpipe(intfields[2]);

Funkcjapipe() umieszcza dwa nowe deskryptory plików w tablicyfields[] (fields[0]deskryptor pliku tylko do odczytu,fields[1] – deskryptor pliku tylko do zapisu) i zwraca 0 w przypadku powodzenia lub -1 w przypadku błędu.

Funkcjapipe() często używana jest w połączeniu z funkcjąfork() w celu zapewnienia komunikacji między procesem macierzystym oraz jego procesami potomnymi.

Złożony przykład

[edytuj |edytuj kod]

Przykład poniżej implementujekorektor pisowni dla zasobówsieciowych wskazywanych przezURL. Znak „\” służy umieszczeniu wszystkich sześciu linii w jednej linii wiersza poleceń.

curl"https://en.wikipedia.org/wiki/Pipeline_(Unix)"|\sed's/[^a-zA-Z ]/ /g'|\tr'A-Z ''a-z\n'|\grep'[a-z]'|\sort-u|\comm-23-/usr/share/dict/words
  1. curl odczytuje kodHTML ze strony internetowej (można użyćwget w niektórych systemach)
  2. sed usuwa wszystkie znaki, które nie są spacjami ani literami zawartymi w treści strony, zastępując je spacjami
  3. tr zamienia wszystkie wielkie litery małymi i zamienia wszystkie spacje w liniach tekstu na nowe linie
  4. grep uwzględnia tylko linie, które zawierają przynajmniej jedną małą literę (usuwając wszystkie puste linijki)
  5. sort sortuje listę „wyrazów” w porządku alfabetycznym, a przełącznik -u usuwa duplikaty
  6. comm(inne języki) znajduje wspólne linie w dwóch plikach, -23 likwiduje linie występujące tylko w drugim pliku i te, które są wspólne dla obu, pozostawiając tylko te, które występują jedynie w pierwszym z nich. Znak „-” wstawiony w miejscu nazwy pliku powoduje, że comm używa swojego standardowego wejścia (w tym przypadku z potoku). W efekcie powstaje lista „wyrazów” (linii), które nie występują w /usr/share/dict/words.

Specjalny znak „|” mówi interpreterowipowłoki, żeby to, co pojawia się na wyjściu jednego procesu, przekazał na wejście następnego. Tak więc wyjście komendy curl jest przekazywane na wejście komendy sed i tak dalej.

Potoki wwierszach poleceń

[edytuj |edytuj kod]

Wszystkie powszechnie używane powłokiUnix iWindows posiadają specjalną strukturę składniową dla tworzenia potoków. W standardowym użyciu polecenia filtra pisane są w sekwencji, oddzielone znakiem „|” (który, z tego powodu jest często nazywane „znakiem pipe”). Powłoka rozpoczyna proces i tworzy niezbędne połączenia pomiędzy standardowymi strumieniami (uwzględniając pewienbufor).

Strumień błędu

[edytuj |edytuj kod]
Wikipedia:Weryfikowalność
Ta sekcja od 2014-07 wymagazweryfikowania podanych informacji.
Należy podać wiarygodne źródła w formieprzypisów bibliograficznych.
Część lub nawet wszystkie informacje w sekcji mogą być nieprawdziwe. Jako pozbawione źródeł mogą zostać zakwestionowane i usunięte.
Sprawdź w źródłach:Encyklopedia PWN •Google Books • Google Scholar • Federacja Bibliotek Cyfrowych •BazHum •BazTech •RCIN • Internet Archive (texts /inlibrary)
Dokładniejsze informacje o tym, co należy poprawić, być może znajdują się wdyskusji tej sekcji.
Po wyeliminowaniu niedoskonałości należy usunąć szablon{{Dopracować}} z tej sekcji.

Z założeniastandardowe strumienie błędów procesów w potoku nie są przez niego przekazywane, lecz łączone i kierowane nakonsolę. Jednakże wiele powłok posiada dodatkową składnię zmieniającą to zachowanie. W powłocecsh, na przykład, używanie „|&” zamiast „|” oznacza, że standardowy strumień błędu powinien także zostać połączony ze standardowym wyjściem i przekazany do następnego procesu.Powłoka Bourne’a także potrafi połączyć standardowy strumień błędów ze standardowym wyjściem (za pomocą 2>&1), jak również przekierować go do innego pliku.

Pipemill (walcownia)

[edytuj |edytuj kod]

W najpowszechniej używanych prostych potokach powłoka łączy serię podprocesów poprzez potok i wykonuje zewnętrzne komendy w obrębie każdego podprocesu. W efekcie powłoka sama w sobie nie wykonuje żadnego bezpośredniego przetwarzania danych wpływających poprzez potok. Jednakże powłoka może wykonać przetwarzanie bezpośrednio. Konstrukt ten, ogólnie rzecz biorąc, wygląda mniej więcej następująco:

command|whilereadvar1var2...;do# przetwórz każdą linię, używając zmiennych parsowanych do $var1, $var2, etc# (zauważ że to jest podpowłoka: var1, var2 etc nie będą dostępne# po zakończeniu pętli)done

...co jest nazywane z angielskiego „pipemill” (walcownia).

Implementacja

[edytuj |edytuj kod]

W większości systemów uniksowych, wszystkie procesy potoku są rozpoczynane jednocześnie, z ich strumieniami odpowiednio połączonymi i zarządzanymi przezalgorytm szeregowania wraz z innymi procesami uruchomionymi na maszynie. Istotnym aspektem, odróżniającym potoki uniksowe od innych, jest koncept buforowania: program wysyłający może wyprodukować do 5000bajtów nasekundę, a program odbierający może ich przyjąć jedynie 100 na sekundę, jednak żadne dane nie giną. Zamiast tego, strumień wyjściowy programu wysyłającego jest trzymany w kolejce. Kiedy program odbierający jest gotów odczytać dane, system operacyjny przesyła mu dane z kolejki, następnie usuwa te dane z kolejki. Jeżeli bufor kolejki się zapełni, program wysyłający zostaje zawieszony (zablokowany) aż do momentu kiedy program odbierający ma możliwość odczytać jakąś część danych i zrobić miejsce w buforze. W systemieGNU/Linux rozmiar buforu to 65536 bajtów.

Potoki sieciowe

[edytuj |edytuj kod]

Narzędzia takie jaknetcat isocat mogą połączyć potoki z gniazdami TCP/IP, zgodnie z jedną z zasadfilozofii UNIX głoszącą, że „wszystko jest plikiem”.

Potok nazwany

[edytuj |edytuj kod]

Potok nazwany (lub łącze nazwane) jest to rozwinięcie idei potoku, polegające na stworzeniu specjalnego pliku, który ma służyć jako łącznik między procesami. Zapewnia to wygodny mechanizm przekazywania danych pomiędzy niespokrewnionymi ze sobą procesami. Wtedy ten specjalny plik potoku jest „nazwą” potoku w tym sensie, że operacje pisania i czytania wykonane na pliku są w istocie czytaniem z i pisaniem do potoku, a plik potoku służy jako swoisty punkt dostępowy.

WUniksie do tworzenia potoków nazwanych stosuje się programmkfifo lubmknod.

$ mkfifo plik_fifo
$ mknod plik_fifo p

Z poziomu programu można skorzystać z następujących dwóch standardowych funkcji:

#include <sys/types.h>#include <sys/stat.h>int mkfifo(const char *path, mode_t mode);int mknod(const char *path, mode_t mode, dev_t dev);

Przypisy

[edytuj |edytuj kod]
  1. http://www.linfo.org/pipe.html Pipes: A Brief Introduction by The Linux Information Project (LINFO).

Linki zewnętrzne

[edytuj |edytuj kod]
Źródło: „https://pl.wikipedia.org/w/index.php?title=Potok_(Unix)&oldid=73421079
Kategorie:
Ukryte kategorie:

[8]ページ先頭

©2009-2025 Movatter.jp