Jeśli chodzi o twoje pytanie dotyczące wydajności, potoki są bardziej wydajne niż pliki, ponieważ nie jest potrzebne IO dysku. cmd1 | cmd2
Jest to więc bardziej wydajne niż cmd1 > tmpfile; cmd2 < tmpfile
(może nie być to prawdą, jeśli tmpfile
jest ono zapisane na dysku RAM lub innym urządzeniu pamięci jako nazwany potok; ale jeśli jest to nazwany potok, cmd1
należy go uruchomić w tle, ponieważ jego wyjście może blokować, jeśli potok się zapełni ). Jeśli potrzebujesz wyniku cmd1
i nadal musisz wysłać jego dane wyjściowe cmd2
, powinieneś cmd1 | tee tmpfile | cmd2
pozwolić cmd1
i cmd2
uruchomić równolegle, unikając operacji odczytu dysku cmd2
.
Nazwane potoki są przydatne, jeśli wiele procesów odczytuje / zapisuje ten sam potok. Mogą być również użyteczne, gdy program nie jest zaprojektowany do używania stdin / stdout dla swoich operacji we / wy potrzebujących plików . Umieszczam pliki kursywą, ponieważ nazwane potoki nie są dokładnie plikami z punktu widzenia przechowywania, ponieważ znajdują się w pamięci i mają stały rozmiar bufora, nawet jeśli mają wpis systemu plików (w celach informacyjnych). Inne rzeczy w systemie UNIX mają wpisy w systemie plików, nie będąc plikami: pomyśl tylko o /dev/null
innych wpisach w /dev
lub /proc
.
Ponieważ potoki (nazwane i nienazwane) mają ustalony rozmiar bufora, operacje odczytu / zapisu na nich mogą blokować, powodując przejście procesu odczytu / zapisu w stan IOWait. Ponadto, kiedy otrzymasz EOF podczas odczytu z bufora pamięci? Zasady dotyczące tego zachowania są dobrze określone i można je znaleźć u mężczyzny.
Jedną rzeczą, której nie można zrobić z potokami (nazwanymi i nienazwanymi), jest wyszukiwanie danych. Ponieważ są one realizowane za pomocą bufora pamięci, jest to zrozumiałe.
O "everything in Linux/Unix is a file"
nie zgadzam się. Nazwane potoki mają wpisy w systemie plików, ale nie są dokładnie plikami. Potoki nienazwane nie mają wpisów w systemie plików (z wyjątkiem być może in /proc
). Jednak większość operacji we / wy w systemie UNIX jest wykonywana przy użyciu funkcji odczytu / zapisu, która wymaga deskryptora pliku , w tym potoku bez nazwy (i gniazda). Nie sądzę, że możemy to powiedzieć "everything in Linux/Unix is a file"
, ale z pewnością możemy to powiedzieć "most IO in Linux/Unix is done using a file descriptor"
.