Warum kann du -sk nicht die Größe eines FIFO melden?

296
Ярослав Рахматуллин

In bash gibt es ein Konzept, das als Prozessersetzung bezeichnet wird. Sie können einen Befehl ausführen und die Ausgabe als Datei verwenden.

z.B

$ cat -n <(seq 3|tac) 1 3 2 2 3 1 

Ich bin neugierig, warum das Folgende fehlschlägt.

$ du -sk <(xzcat /var/log/mpd/scribble.log.xz ) 0 /dev/fd/63 

Ebenso haben wir das

$ file <(seq 1 2) /dev/fd/63: broken symbolic link to pipe:[32560687] 

Die Datei ist nicht leer.

$ xzcat /var/log/mpd/scribble.log.xz | wc -c  16877047  >/dev/null pv <(xzcat /var/log/mpd/scribble.log.xz )  16.1MiB 0:00:00 [ 232MiB/s] [ <=> ] 

Kennen Sie als Bonusfrage eine Technik in bash bis masquarade fifos als reguläre Dateien für kurze Zeit?

1

1 Antwort auf die Frage

1
Oleg Bolden

Reguläre Dateien bestehen aus drei Hauptbestandteilen:

  1. Name (Hardlink)
  2. Inode (Systeminfo)
  3. Körper (Daten)

Pipes (egal, anonym, persistent oder temporär) haben keinen Körper. Daher haben sie im Gegensatz zu regulären Dateien immer eine Größe von Null. Sie haben nur In-Memory-Puffer. Aus diesem Grund hat die anonyme Named Pipe / dev / fd / 63 die Länge Null. Sie können jeden anderen Befehl innerhalb des Operators <(...) mit demselben Ergebnis verwenden, beispielsweise

du -sk <(cat somefile)

Sie können mit dem Befehl mkfifo einen Named Pipe erstellen, um zu sehen, dass seine Größe immer gleich Null ist, selbst wenn Sie den Puffer vollständig gefüllt haben. Tatsächlich hat die Dateigröße von benannten (und anderen) Pipes keinen wirklichen Sinn und wird für die Einheitlichkeit der Auflistung unter anderen Dateien auf Null gesetzt.

Die * Länge der Pipe * entspricht also dem Inhalt des Puffers, der etwas oder nichts sein kann, und der einzige Weg, um herauszufinden, ist, ob Sie auf den Puffer zugreifen. Ярослав Рахматуллин vor 6 Jahren 0
Ich würde es eher "Kapazität" als "Größe" nennen. Die Kapazität von FIFO ist normalerweise auf 64 KB beschränkt, die maximale Puffergröße in modernen Linux-Systemen beträgt jedoch 1 MB ("cat / proc / sys / fs / pipe-max-size"). Es gibt immer zwei Gegenstücke - Leser von FIFO und Schreiber. Sowohl der Schreiber als auch der Leser erhalten und erhalten Informationen in Portionen, bis der Leser im Datenfluss eine EOF-Markierung erhält. In diesem Moment gilt die Datenübertragung als konkurrierend und die Pipe wird gelöscht (sofern es sich nicht um Pipe handelt). Oleg Bolden vor 6 Jahren 0