2009-08-14 21 views
5

¿Cómo se limpia el buffer io en Erlang?Cómo vaciar el buffer io en Erlang?

Para instace:

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

This post parece indicar que no hay una solución limpia.

¿Existe una solución mejor que en esa publicación?

+0

Disculpa, no tengo más respuesta que una pregunta. Tengo mucha curiosidad por saber por qué querrías vaciar el buffer io, entonces; ¿Por qué? :) –

+0

AFAIK no es posible con la implementación actual del servidor io. Su enlace está roto, pero este se refiere a un problema causado por la falta de operaciones de vaciado: http://erlang.org/pipermail/erlang-questions/2011-April/057492.html –

Respuesta

5

desgracia que no sea la correcta realización de un "comando" flush en los subsistemas io/kernel y asegurándose de que los controladores de bajo nivel que implementan el apoyo real io un comando que realmente tienen que confiar simplemente en la quiescing sistema antes clausura. Un error, creo.

Eche un vistazo a io.erl/io_lib.erl en stdlib y file_io_server.erl/prim_file.erl en kernel para los detalles sangrientos.

Como un ejemplo, en file_io_server (que toma eficazmente la solicitud de io/io_lib y rutas de TI para el controlador correcto), los tipos de comandos son:

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

(es decir, no flush)!

Como alternativa, siempre puede cerrar su salida (lo que forzaría un color) después de cada escritura. Un módulo de registro que tengo hace algo como esto cada vez y no parece ser tan lento (es un gen_server con el registro de recibido a través de mensajes elenco):

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

No es que lo haya hecho alguna vez, pero desde mi entender, implementar un servidor io no es tan complejo, especialmente porque puedes usar io_lib para algunas de las solicitudes más complejas. Creo que está trabajando en algo con el módulo de archivo, usando el archivo: sincronización/llamada 1 uno puede sincronizar el resultado de forma explícita. Simplemente no se hará utilizando una llamada io, sino un mensaje personalizado, a menos que uno lo vincule a la solicitud io: nl (IO). – Christian

-4

podría ejecutar

flush(). 

de la cáscara, o tratar

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

que funciona más o menos como un rubor C.

+3

Esto vacía el buzón de proceso y no el buffer io. – hcs42

+0

@Fonz, le sugiero que elimine su respuesta, ya que es irrelevante, ¡tenga cuidado! – securecurve

0
io:put_chars(<<>>) 

al final del script funciona para mí.