2012-04-15 24 views
2

Wenn Sie read() syscall in Linux zum Lesen aus welcher Quelle (Datei, Socket, Pipe) verwenden, gibt es eine minimale Datenmenge, die zurückgegeben werden kann (im Blockiermodus)? Oder kann der Syscall sogar 1 Byte zurückgeben?Linux read() minimale Datenmenge

Wenn ich ein einzelnes int (4 oder 8 Bytes) aus einer Pipe lesen möchte, muss ich noch den Rückgabewert von read() überprüfen, um zu sehen, ob ich weniger als sizeof (int) Bytes erhielt?

+0

In der Praxis ist es nicht effizient, einen 'read (2)' syscall für jedes Wort oder Byte zu machen. Sie sollten Ihre Lesevorgänge zwischenspeichern (mit einer Puffergröße von beispielsweise 1K - 128K Byte) oder eine Bibliothek (z. B. '' mit 'fread') verwenden, die die Pufferung für Sie durchführt. –

+0

Ich möchte es für IPC verwenden, wo ich nur einen int zu einem anderen Prozess senden muss. – kuba

+0

Aber Sie können immer noch eine größere Menge lesen. Es kann Fälle geben, in denen Sie mehr als einmal int lesen müssen (z. B. wenn Ihr Prozess nicht oft genug geplant wurde, weil das System zu beschäftigt ist und/oder der andere Schreibprozess Daten mit hoher Geschwindigkeit ausgibt) das Rohr). –

Antwort

5

Es gibt kein Minimum, außer bei Geräten im Blockmodus, bei denen das Minimum die Blockgröße ist.

Sie sollten immer den Rückgabewert überprüfen; Dinge können brechen, Sie sollten für Bruch planen und kurze Lesevorgänge und Fehler angemessen behandeln, anstatt anzunehmen, dass die andere Seite immer perfekt ist.

+2

Auch wenn Sie von Block-Geräten lesen, können Sie eine kleinere Menge lesen. Es ist nur, dass das Betriebssystem einen ganzen Block vom zugrunde liegenden Gerät liest, aber nicht alle Daten an Sie zurückgibt. –