Как очистить буфер ввода-вывода в Erlang?
Вопрос
Как очистить буфер ввода-вывода в 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.