Pufferpipe (benannt) in GNU OS

9

Im GNU-Betriebssystem kann ein Prozess nur dann Daten in eine Pipe schreiben, wenn ein anderer Prozess gleichzeitig dieselben Daten (aus derselben Pipe) liest.

Gibt es so etwas wie eine Pipe, mit der der erste Prozess die Daten schreiben und puffern kann, bis der zweite sie liest?

Al Klimov
quelle

Antworten:

5

Eine Named Pipe (Fifo) kann bis zu einem gewissen Punkt tun, was Sie wollen, aber mit ein paar Einschränkungen:

  1. Wenn Sie in die Pipe schreiben möchten, bevor der Reader vorhanden ist, muss Ihr Writer das Fifo als Lese- / Schreibzugriff öffnen, da sonst der Aufruf openblockiert wird. In der Shell könnte dies so aussehen:

    exec 3<>/path/to/pipe
    echo "foo" >&3
    cat <&3
    

    Wie Sie dort sehen können, kann ich in die Pipe schreiben, bevor der Leser da ist. Sobald ich aus der Pipe gelesen habe, sind die Nachrichten, die ich geschrieben habe, bereits da.

  2. Schreibvorgänge in die Pipe werden schließlich blockiert, sobald die Pipe gefüllt ist. Laut Pipe (7) unter Linux:

Ein Rohr hat eine begrenzte Kapazität. Wenn die Pipe voll ist, wird ein Schreibvorgang (2) blockiert oder schlägt fehl, je nachdem, ob das Flag O_NONBLOCK gesetzt ist (siehe unten). Unterschiedliche Implementierungen haben unterschiedliche Grenzen für die Rohrkapazität. Anwendungen sollten nicht auf eine bestimmte Kapazität angewiesen sein: Eine Anwendung sollte so konzipiert sein, dass ein Lesevorgang Daten verbraucht, sobald sie verfügbar sind, damit ein Schreibvorgang nicht blockiert bleibt.

In Linux-Versionen vor 2.6.11 entsprach die Kapazität einer Pipe der Seitengröße des Systems (z. B. 4096 Byte auf i386). Seit Linux 2.6.11 beträgt die Pipe-Kapazität 65536 Byte.

Abhängig von Ihrem Anwendungsfall können Sie auch eine Nachrichtenwarteschlange verwenden. Der Kernel stellt eine Nachrichtenwarteschlange bereit. Unter Linux finden Sie in mq_overview (7) eine gute Übersicht. Alternativ bieten Dienste wie RabbitMQ Nachrichtenwarteschlangen mit einer Vielzahl von Funktionen, einschließlich der Verwendung über ein Netzwerk.

Steven D.
quelle
Ich möchte die Kapazität zur Laufzeit definieren.
Al Klimov
@AlKlimov Es scheint, dass Sie die Kapazität des Rohrs mit dem f_SETPIPE_SZ fcntl einstellen können. Weitere Informationen finden Sie unter man7.org/linux/man-pages/man2/fcntl.2.html .
Steven D