In Bezug auf Ihre Leistungsfrage sind Pipes effizienter als Dateien, da keine Datenträger-E / A-Vorgänge erforderlich sind. So cmd1 | cmd2
ist effizienter als cmd1 > tmpfile; cmd2 < tmpfile
(dies kann nicht wahr sein , wenn tmpfile
auf einer RAM - Disk oder einem anderen Speichergerät als Named Pipe gesichert wird, aber wenn es sich um eine Named Pipe ist, cmd1
sollte im Hintergrund ausgeführt werden , da sein Ausgang blockieren kann , wenn das Rohr voll ist ). Wenn Sie das Ergebnis von cmd1
benötigen und dennoch seine Ausgabe an senden müssen cmd2
, sollten Sie cmd1 | tee tmpfile | cmd2
zulassen cmd1
und cmd2
parallel ausführen, um Festplattenlesevorgänge von zu vermeiden cmd2
.
Named Pipes sind nützlich, wenn viele Prozesse dieselbe Pipe lesen / schreiben. Sie können auch nützlich sein, wenn ein Programm nicht für die Verwendung von stdin / stdout entwickelt wurde, da sein E / A Dateien verwenden muss . Ich habe Dateien kursiv geschrieben, weil Named Pipes aus Speichersicht keine Dateien sind, da sie sich im Speicher befinden und eine feste Puffergröße haben, auch wenn sie einen Dateisystemeintrag haben (zu Referenzzwecken). Andere Dinge in UNIX haben Dateisystemeinträge, ohne Dateien zu sein: man denke nur an /dev/null
oder andere Einträge in /dev
oder /proc
.
Da Pipes (mit und ohne Namen) eine feste Puffergröße haben, können Lese- / Schreibvorgänge blockiert werden, wodurch der Lese- / Schreibvorgang in den IOWait-Status versetzt wird. Wann erhalten Sie eine EOF, wenn Sie aus einem Speicherpuffer lesen? Regeln zu diesem Verhalten sind gut definiert und können im Mann gefunden werden.
Eine Sache, die Sie mit Pipes (benannt und unbenannt) nicht machen können, ist das Zurücksuchen in den Daten. Da sie mit einem Speicherpuffer implementiert werden, ist dies verständlich.
Über "everything in Linux/Unix is a file"
stimme ich nicht zu. Named Pipes haben Dateisystemeinträge, sind aber nicht genau Datei. Unbenannte Pipes haben keine Dateisystemeinträge (außer vielleicht in /proc
). Die meisten E / A-Vorgänge unter UNIX werden jedoch mit der Lese- / Schreibfunktion ausgeführt, für die ein Dateideskriptor erforderlich ist , einschließlich einer unbenannten Pipe (und eines Sockets). Ich denke nicht, dass wir das sagen können "everything in Linux/Unix is a file"
, aber wir können das mit Sicherheit sagen "most IO in Linux/Unix is done using a file descriptor"
.