Lua 中的 stdin、stdout 和 stderr 是缓存还是非缓存的?

我并没有在外部找到太多提到这个的信息。Lua 中的标准 io 描述符是默认缓冲还是非缓冲的呢?如果需要,我能切换到不同的模式吗?

举例来说,Python 提供了 sys.stdin.detach 使其变为非缓冲模式。

点赞
用户2633423
用户2633423

参见setvbuf。它是与底层C的setvbuf函数进行交互的界面。

例如,您可以像这样使用它:

io.stdout:setvbuf 'no'    -- 关闭标准输出流的缓冲

据我所知,Lua依赖于底层C运行时来连接标准流,因此我认为C标准流的通常保证适用。

2013-08-30 21:42:55
用户1009479
用户1009479

由于 Lua 内部使用了 C 的标准流,因此这个问题也询问了标准流的 默认缓冲方式。相同的规则适用于 Lua:

标准 C 要求:

  1. 标准输入和标准输出是完全缓冲的,当且仅当它们不引用交互式设备时。
  2. 标准错误永远不会完全缓冲。

POSIX 暗示(但不强制要求):

  1. 标准错误永远不会缓冲。
  2. 如果其他流引用终端设备,则它们都是行缓冲的;否则,它们是完全缓冲的。

与 C 相同,可以使用 setvbuf 修改缓冲设置。

2013-08-31 00:44:03