Haskell: Lesen von / proc. Probleme mit Strenge und Faulheit. Statistiken verarbeiten

8

Ich habe wirklich seltsames Verhalten beim Lesen von Dateien aus / proc Wenn ich / proc / pid / stat träge mit preludes readFile lese - funktioniert das aber nicht so, wie ich es möchte. Das Umschalten auf strict reading mit Data.ByteString.readFile gibt mir eine leere Zeichenfolge.

Ich muss hier genau lesen, um die Ergebnisse zweier Lesevorgänge innerhalb eines kurzen Intervalls vergleichen zu können.

So funktioniert die Verwendung von System.IO.readFile zum Lesen von / proc / pid / stat einfach nicht. Es gibt mir das gleiche Ergebnis innerhalb von 0,5 Sekunden. Ich denke, das liegt an der Faulheit und dem halb geschlossenen Griff oder etwas ... Das Öffnen und Schließen des Dateihandle funktioniert explizit.

%Vor%

Aber warum tun Sie das oben, wenn wir das bytestring strenge Lesen haben. Richtig?

Hier bin ich steckengeblieben.

%Vor%

Dies gibt immer eine leere Zeichenfolge zurück. Auch in GHCI getestet. Irgendwelche Vorschläge. Danke.

--- AKTUALISIEREN ---

Danke Daniel für Vorschläge.

Das muss ich eigentlich tun. Dies könnte helfen, mein Dilemma vollständig zu zeigen und allgemeinere Vorschläge zu bringen.

Ich muss Prozessstatistiken berechnen. Hier ist ein Teil des Codes (nur die CPU-Nutzung) als Beispiel.

%Vor%
  1. Prelude.readFile funktioniert aufgrund der Faulheit nicht
  2. Strikte Funktionen von ByteString funktionieren nicht. Danke Daniel für die Erklärung.
  3. withFile würde funktionieren (es schließt den Griff richtig), wenn ich die ganze Berechnung in ihn stopfte, aber dann wird das Intervall nicht genau 0,5 sein, da Berechnungen Zeit brauchen.
  4. Das explizite Öffnen und Schließen von Handles und das Verwenden von hGetContents funktioniert nicht! Aus dem gleichen Grund readFile nicht.

Das einzige, was in dieser Situation funktioniert, ist das explizite Öffnen und Schließen von Handles mit hGetLine im obigen Code-Snippet. Aber das ist nicht gut genug, da einige proc-Dateien mehr als eine Zeile wie / proc / meminfo sind.

Also brauche ich eine Funktion, die die ganze Datei strikt lesen würde. Etwas wie hGetContents aber streng.

Ich habe versucht, dies zu tun:

%Vor%

In der Hoffnung, dass Zeilen die Datei vollständig lesen würden. Kein Glück. Immer noch eine leere Liste.

Jede Hilfe, Vorschlag wird sehr geschätzt.

    
r.sendecky 17.04.2012, 02:14
quelle

2 Antworten

5

Der ByteString Code ist

%Vor%

Aber /proc/whatever ist keine echte Datei, sie wird bei Bedarf generiert, wenn Sie stat sie erhalten, um die Dateigröße zu erhalten, erhalten Sie 0. So ByteString s readFile liest erfolgreich 0 Bytes.

    
Daniel Fischer 17.04.2012, 02:26
quelle
5

Bevor Sie diese Art von Dingen programmieren, ist es in der Regel eine gute Idee, zu überprüfen, ob auf Hackage bereits etwas vorhanden ist. In diesem Fall habe ich das Paket procstat gefunden. das scheint gut zu funktionieren:

%Vor%     
hammar 17.04.2012 06:02
quelle

Tags und Links