io:format(user, "hello"). This post似乎表明没有干净的解决方案-6ren">
gpt4 book ai didi

input - 如何在 Erlang 中刷新 io 缓冲区?

转载 作者:行者123 更新时间:2023-12-03 18:00:21 26 4
gpt4 key购买 nike

你如何刷新 Erlang 中的 io 缓冲区?
例如:

> io:format("hello"),
> io:format(user, "hello").
This post似乎表明没有干净的解决方案。
有比那个帖子更好的解决方案吗?

最佳答案

可悲的是,除了在 io/内核子系统中正确实现刷新“命令”并确保实现实际 io 的低级驱动程序支持这样的命令之外,您实际上必须简单地依赖系统在关闭前静默。我认为是失败的。

查看 stdlib 中的 io.erl/io_lib.erl 和内核中的 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);

关于input - 如何在 Erlang 中刷新 io 缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1280746/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com