2009-08-14 6 views
5

Come si scarica il buffer io in Erlang?Come svuotare il buffer io in Erlang?

Per instace:

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

This post sembra indicare che non esiste una soluzione pulita.

C'è una soluzione migliore rispetto a quel post?

+0

Spiacente, non ho una risposta, ma una domanda. Sono incredibilmente curioso di sapere perché vorresti svuotare il buffer io, quindi; Perché? :) –

+0

AFAIK non è possibile con l'attuale implementazione del server io. Il tuo link è rotto, ma questo si riferisce a un problema causato dalla mancanza di operazioni di flush: http://erlang.org/pipermail/erlang-questions/2011-April/057492.html –

risposta

5

Purtroppo diverso da dare corretta attuazione di un "comando" flush nei sottosistemi IO/kernel e fare in modo che i driver di basso livello che implementano un tale comando il supporto reale io realmente devono fare affidamento semplicemente sulla essere messo in pausa sistema prima chiusura. Un fallimento, penso.

Dai un'occhiata a io.erl/io_lib.erl in stdlib e file_io_server.erl/prim_file.erl nel kernel per i dettagli cruenti.

Ad esempio, in file_io_server (che avviene effettivamente la richiesta da io/io_lib e instrada il driver corretto), i tipi di comando sono:

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

(cioè senza filo)!

In alternativa, si potrebbe sempre chiudere l'output (che impone un flush) dopo ogni scrittura. Un modulo di registrazione ho fa qualcosa come questo ogni volta e non sembra essere che lento (si tratta di un gen_server con la registrazione ricevuti tramite messaggi del cast):

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

Non è che l'abbia mai fatto, ma dalla mia comprensione l'implementazione di un server io non è così complessa, soprattutto perché è possibile utilizzare io_lib per alcune delle richieste più complesse. Penso che tu stia facendo qualcosa con il modulo file, usando il file: sync/1 call one puoi sincronizzare l'output in modo esplicito. Non sarà fatto usando una chiamata io, ma un messaggio personalizzato, a meno che non lo leghi alla richiesta io: nl (IO). – Christian

-4

si potrebbe correre

flush(). 

dalla shell, o provare

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

che funziona più o meno come un colore C.

+3

Questo svuota la cassetta postale del processo e non il buffer io. – hcs42

+0

@ Fonz, suggerisco di rimuovere la risposta, poiché è irrilevante, attenzione! – securecurve

0
io:put_chars(<<>>) 

alla fine della sceneggiatura funziona per me.