2016-12-15 2 views
-2

Befehle, die von LISP aufgerufen werden, haben Probleme mit gepufferten IO-Streams, wie kann man sie ausschalten? Ich habe nur Spülfunktionen gefunden, die in dieser Situation nichts bringen.IO-Pufferung ausschalten

+0

Könnten Sie weitere Details hinzufügen, bitte, welche Befehle, wie aufgerufen, welche Art von Ärger? – cybevnm

+0

* "... in dieser Situation" *. Welche Situation? – coredump

+0

Shell-Befehl, um genau zu sein – Seraph

Antwort

5

Sie können nicht tun,

Es gibt keine tragbare Art und Weise Pufferung ein- und ausgeschaltet, und für einen sehr guten Grund: gepuffert i/o Größenordnungen schneller ist.

Sie sollten nicht versuchen zu tun, dass

Sie könnten in der Lage sein, um herauszufinden, wie es Sie bei der Umsetzung tun zu verwenden, aber es wird eine Verschwendung von Zeit - Sie werden bald erkennen, dass es ein Fehler war, . Bitte tu dir selbst einen Gefallen und verfolge meine Schritte nicht - das habe ich vor fast 20 Jahren versucht.

Es gibt einen besseren Weg

Wenn Sie mit dem Schreiben fertig sind, nur flush the output.

Sie können dies mithilfe von Klassen oder Makros kapseln, sodass keine zusätzliche Typisierung erforderlich ist.

Es ist besser, aus vielen Gründen

Bitte beachten Sie, dass der Ansatz, den ich vorschlagen, wird der Code besser lesbar machen - es erfordert, dass Sie Ihre Nachricht Grenzen explizit angeben. Denken Sie daran, Sie schreiben Code für andere (und Sie selbst in 6 Monaten!) Zu lesen, zu ändern und zu debuggen.

+0

Danke, aber wie man das macht, wenn funtion run-Befehl für Shell-Skript redirect io von Befehl zu lisp io Streams, kann ich sie nicht flush, weil ich weiß nicht, wenn Befehl ausführen lesen/schreiben – Seraph

+1

Okay, das ist eine sehr spezifische Situation: _usual_ Shell-Befehle (zB 'ls') und Lisp-Shell-Pipes sind _line_ gepuffert und dies ist genau das, was Sie wollen. Wenn dies nicht der Fall ist, fragen Sie bitte eine * separate * Frage mit einem reproduzierbaren Beispiel. – sds

+0

@Seraph Haben Sie Probleme mit "Input Buffering" oder "Output Buffering"? Das heißt, bleibst du hängen, weil etwas, das du in den Befehl schreibst, nicht an sie gesendet wird ('finish-output' und Freunde sollten hier helfen) oder bleibst du stecken und lest etwas, das der erzeugte Befehl gedruckt hat? Wenn es Letzteres ist, wird es wahrscheinlich durch den Befehl gepuffert, nicht durch die Pipe oder Lisp-Umgebung. – Vatine

0

So fand ich endlich das Problem (vielleicht Fehler ??)

Formular sieht wie folgt aus (SBCL API)

(run-program "sudo" '("mv" "foo.txt" "/usr/bin") 
    :search t 
    :output t 
    :input t 
    :wait t) 

Das funktioniert genau, wie ich wollte, war Problem, dass anstelle von t in Eingang und Ausgang Args, ich spezifizierte *standard-input* und *standard-output*, die nicht ordnungsgemäße Arbeit des Befehls verursacht (wenn aufgerufen Programm wollte einige Eingabe von Benutzer wie sudo zum Beispiel).

Keine Ahnung warum, aber zumindest funktioniert es jetzt.