Ich spawn einen Prozess von Common Lisp-Programm (gnuplot). Ich kann Ein- und Ausgabeströme für den Prozess einrichten. Ich habe jedoch ein Problem beim Lesen von der Ausgabe. Das Problem ist, dass ich versuchen möchte, aus der Ausgabe zu lesen, und wenn da nichts ist, naja ... tue nichts zum Beispiel.Wie erkennt man, ob der Eingabestream leer ist (aber nicht EOF)?
(Grundproblem: Ich möchte show term
das Ergebnis des Befehls lesen, aber ich möchte andere Ausgabe überspringen, dass gnuplot könnte vor dem Senden Sie diesen Befehl erzeugt haben)
Wenn ich nur (read-line gnuplot-output nil :eof)
verwenden und es gibt nichts in Ausgangsstrom, wird es nicht :eof
anzeigen (da der Strom noch am Leben ist und etwas dort erscheinen könnte) und wird nur blockieren, bis es etwas zu lesen hat (dh für immer).
Gibt es eine Möglichkeit zu erkennen, dass nichts zu lesen ist? Zumindest kann der Versuch, den Lesevorgang irgendwie sicher zu unterbrechen, beendet werden (d. H. Es sollte keine neue Zeile aus dem Stream entfernt werden, sobald das Timeout erreicht ist).
PS. Ich verwende SBCL
1+ Für OP: siehe auch 'read-char-no-hang' – coredump
Mit' read-char-no-hang' brauchen Sie 'listen' nicht zu verwenden. Auch das Zusammenlegen von Variablenbindungen von einem äußeren 'let' /' let * 'zum inneren' do'/'do *' wie in einer Ihrer Bearbeitungen behindert die Lesbarkeit und Wartbarkeit des Codes, nur um ein paar Zeichen zu sparen. Sowohl 'program' als auch' output-stream' variieren nicht in der Schleife, so dass sie in einem äußeren 'let' /' let * 'liegen würden. – acelent
@acalent Das 'listen' soll prüfen, ob etwas zu lesen ist, ohne es zu lesen. Wenn nur 'read-char-no-hang' verwendet wird, wird das erste Zeichen der Eingabe konsumiert, wodurch die Logik komplizierter wird. Was die Variablenbindungen in einem separaten "let" anbelangt, dachte ich, dass das zunächst klarer wäre, aber da die Schleife so lange ausgeführt werden sollte, bis das Programm beendet wird, ist es sinnvoll, das Programm in den Schleifen zu starten Initialisierung. Auf diese Weise ist die gesamte Lebensdauer des Kindprozesses an einem Ort. – jkiiski