Wie lange bleiben FIFOs (Named Pipes) "offen"?

3366
n0pe

Zum Beispiel habe ich ein Skript, das die Zeit in eine Pipe in / etc / pipe schreibt. Es schreibt kontinuierlich in einer wahren Schleife. Wie lange stehen die Daten in der Pipe zum Lesen zur Verfügung? Wenn ich mich dazu entscheide, die Pipe nur einen Tag später mit cat / etc / pipe zu lesen, bekomme ich alle Zeitwerte gleich zu Beginn des Schreibens?

Umgekehrt, was wäre, wenn meine Schleife nur alle 10 Minuten die Zeit schrieb. Kann ich einen Tag später auf alles zugreifen?

Schließlich tu so, als würde meine Schleife die Zeit kontinuierlich schreiben (wie mein erstes Beispiel) und ich lese die Pfeife alle 30 Minuten. Wenn mein Computer direkt vor dem Lesen der Pipe herunterfährt, ist die Pipe beim Neustart leer oder enthält sie alle diese Daten?

4

1 Antwort auf die Frage

6
Let_Me_Be

Der Prozess kann PIPE_BUFBytes (siehe linux/limits.h) in die Pipe schreiben . Dann bleibt es stecken, bis einige Daten gelesen werden.

Die gepufferten Daten werden so lange aufbewahrt, wie mindestens ein Ende der Pipe offen ist - es gibt kein "Timeout" oder ähnliches. Die Puffer bleiben jedoch im Speicher und werden nicht neu gestartet.

pipe(7)Weitere Informationen finden Sie auf der Handbuchseite, insbesondere im Abschnitt "Rohrleitungskapazität".

Ein Rohr hat eine begrenzte Kapazität. Wenn die Pipe voll ist, wird ein write(2)Will blockieren oder fehlschlagen, abhängig davon, ob das Flag O_NONBLOCK gesetzt ist (siehe unten).

[...] Seit Linux 2.6.11 beträgt die Pipe-Kapazität 65536 Bytes.

Kann dieser Wert sicher geändert werden? n0pe vor 12 Jahren 1
@MaxMackie Es sollte eine Konstante sein. Let_Me_Be vor 12 Jahren 0
Ich habe das verstanden, ich meinte, es gibt einen besonderen Weg, um es zu ändern, ohne andere Probleme mit anderen Programmen zu haben. Und ist es gefährlich, den Wert auf eine sehr hohe Konstante zu setzen? n0pe vor 12 Jahren 0
@ MaxMackie Ich denke, Sie könnten eine spezielle Kernel-Version aus geänderten Quellen erstellen. Let_Me_Be vor 12 Jahren 1