2009-08-14 10 views
5

Wie spülen Sie den IO-Puffer in Erlang?Wie spült man den io Puffer in Erlang?

Für instace:

io:format("hello") oder io:format(user, "hello")

This post scheint darauf hinzudeuten, dass es keine saubere Lösung.

Gibt es eine bessere Lösung als in diesem Post?

+0

Sorry, ich habe keine Antwort, aber eine Frage. Ich bin unglaublich neugierig, warum du den io-Puffer spülen willst, also; Warum? :) –

+0

AFAIK ist es nicht möglich mit der aktuellen IO-Server-Implementierung. Dein Link ist defekt, aber dieser bezieht sich auf ein Problem, das durch das Fehlen von Flush-Operationen verursacht wurde: http://erlang.org/pipermail/erlang-questions/2011-April/057492.html –

Antwort

5

Leider andere als richtig einen Flush „command“ in den io/Kernel-Subsysteme und dafür, dass die Umsetzung, dass die niedrigen Level-Treiber, die die tatsächliche io Unterstützung einen solchen Befehl implementieren Sie wirklich einfach müssen auf dem System Stilllegungs verlassen vor Schließen. Ein Fehler, denke ich.

Schauen Sie sich ilo.erl/io_lib.erl in stdlib und file_io_server.erl/prim_file.erl im Kernel für die blutigen Details an.

Als Beispiel in file_io_server (die effektiv die Anforderung von io/io_lib und leitet sie an den richtigen Fahrer nimmt), sind die Befehlstypen:

{put_chars,Chars} 
{get_until,...} 
{get_chars,...} 
{get_line,...} 
{setopts, ...} 

(das heißt kein Flush)!

Als Alternative könnten Sie natürlich Ihre Ausgabe (die einen Flush erzwingen würde) immer nach jedem Schreiben schließen. Ein Logging-Modul Ich habe etwas tut, wie dies jedes Mal, und es scheint nicht, dass langsam zu sein (es ist ein gen_server mit der Protokollierung über Guss Nachrichten empfangen):

case file:open(LogFile, [append]) of 
    {ok, IODevice} -> 
    io:fwrite(IODevice, "~n~2..0B ~2..0B ~4..0B, ~2..0B:~2..0B:~2..0B: ~-8s : ~-20s : ~12w : ", 
      [Day, Month, Year, Hour, Minute, Second, Priority, Module, Pid]), 
    io:fwrite(IODevice, Msg, Params), 
    io:fwrite(IODevice, "~c", [13]), 
    file:close(IODevice); 
+0

Nicht dass ich es jemals getan habe, aber aus meiner Sicht ist die Implementierung eines io-Servers nicht so komplex, zumal Sie io_lib für einige komplexere Anfragen verwenden können. Ich denke du bist auf etwas mit dem Dateimodul, mit der Datei: Sync/1 Anruf kann man die Ausgabe explizit synchronisieren. Es wird nicht nur mit einem io-call, sondern auch mit einer benutzerdefinierten Nachricht gemacht, es sei denn, man bindet sie an die io: nl (IO) -Anfrage. – Christian

-4

Sie laufen konnten

flush(). 

aus der Schale oder

flush()-> 
receive 
    _ -> flush() 
after 0 -> ok 
end. 

versuchen, die mehr oder weniger wie ein C bündig funktioniert.

+3

Dies löscht das Prozesspostfach und nicht den IO-Puffer. – hcs42

+0

@Fonz, ich schlage vor, Ihre Antwort zu entfernen, da es irrelevant ist, passen Sie auf! – securecurve

0
io:put_chars(<<>>) 

am Ende des Skripts funktioniert für mich.