Вопрос

Как очистить буфер ввода-вывода в Erlang?

Например:

io:format("hello") илиio:format(user, "hello")

Эта почта кажется, указывает на то, что чистого решения не существует.

Есть ли лучшее решение, чем в этом посте?

Это было полезно?

Решение

К сожалению, кроме правильной реализации «команды» сброса в подсистемах io/kernel. и Убедившись, что драйверы низкого уровня, реализующие фактический ввод-вывод, поддерживают такую ​​команду, вам действительно нужно просто полагаться на стабилизацию системы перед закрытием.Я думаю, это провал.

Посмотрите io.erl/io_lib.erl в stdlib и file_io_server.erl/prim_file.erl в ядре, чтобы узнать подробности.

Например, в file_io_server (который фактически принимает запрос от io/io_lib и направляет его правильному драйверу) типы команд следующие:

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

(т.е.нет смыва)!

В качестве альтернативы вы, конечно, можете всегда закрывать вывод (что приведет к принудительному сбросу) после каждой записи.Модуль журналирования, который у меня есть, каждый раз делает что-то подобное, и он не выглядит таким медленным (это gen_server с журналированием, полученным через сообщения приведения):

  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);

Другие советы

io:put_chars(<<>>)

в конце скрипт у меня работает.

ты мог бы бежать

flush().

из оболочки или попробуйте

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

Это работает более или менее как флеш C.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top