Wie in portable C nach vorne zu suchen, wenn aus einer Leitung gelesen wird

8

Da fseek() bei Pipes nicht funktioniert, welche Methoden gibt es, um vorwärts zu suchen? Der naive Ansatz besteht darin, fread() zu verwenden und die gelesenen Inhalte in den Speicherpuffer zu werfen. Bei großen Versuchen, große Puffer zu vermeiden, würden Sie den gleichen Puffer immer wieder mit dem letzten Lesen verwenden, indem Sie nur einen Teil des Puffers verwenden.

Aber ist das der einzige Ansatz? Gibt es einen anderen Weg, der den Puffer und die mögliche Mehrfachlesung vermeidet?

    
hippietrail 27.04.2011, 15:22
quelle

2 Antworten

4

Ja, das ist der einzige Weg. Ich würde einen Puffer irgendwo um 1k-8k verwenden. Mit viel kleiner wird der Syscall Overhead für das Lesen ins Spiel kommen, und mit viel größer werden Sie nützliche Daten aus dem Cache entfernen.

    
R.. 27.04.2011, 15:38
quelle
5

Das Suchen macht bei Pipes keinen Sinn, weil die Eingabe dynamisch erzeugt wird (nicht auf der Festplatte gespeichert). Der Kernel-Systemaufruf lseek ist für Pipes nicht implementiert.

Bedenken Sie auch, dass eine Pipe im Wesentlichen ein Erzeuger-Verbraucher-Puffer einer begrenzten, festen Größe ist. Wenn es voll ist, wird der Erzeuger angehalten, bis der Verbraucher die ältesten Daten liest.

    
Blagovest Buyukliev 27.04.2011 15:26
quelle

Tags und Links