Pracuję na systemie Linux działającym na jądrze 3.2.0. Na tym systemie napisałem program, który ostatecznie wygeneruje około 50 GB danych, które następnie wyśle na standardowe wyjście. To wyjście chcę przekierować do pliku.
Czy może dojść do przelewu rur? Czy rury działają niezawodnie, niezależnie od ilości danych?
Odpowiedzi:
Rury nie mogą się przelać. Rura to tylko bufor (pewna ilość pamięci, najprawdopodobniej 64 KB w bieżącym systemie) między producentem a konsumentem. Jeśli producent produkuje szybciej niż konsument konsumuje, jest on blokowany (co oznacza, że program będzie spał), dopóki konsument nie zwolni miejsca w buforze, czytając z niego.
Poza tym opisany przypadek nie jest technicznie fajką. Jeśli mówimy o POSIX
sh
, przekierowanie do pliku (acommand > afile
) powoduje, że punkt wejścia polecenia jest bezpośrednio do pliku. Rura wiąże się z|
postacią, przez przypadek nazywany również „rura”, i jest to połączenie między dwoma programami uruchomionymi:acommand | anothercommand
.(Ale z drugiej strony, to, co naprawdę dzieje się za kulisami, to inna historia: Na przykład w katalogu / dev znajduje się wiele plików pseudo urządzeń, które faktycznie przekierowują do uruchomionych procesów. Na przykład
echo Hello World > /dev/pts/1
mogą zapisywać do twojego obecnego Xterma)źródło