我正在尝试使用luv构建一个 NES 模拟器插件,该插件可以在不暂停游戏模拟的情况下与另一个进程通信。当我通过手动输入数据进行测试时,我遇到了一些运行顺利的事情,但是当我通过管道测试与另一个进程通信时,lua 脚本似乎从未收到任何数据。
作为最小可重现示例,使用以下 lua 脚本:
local uv = require("luv")
local stdin = uv.new_poll(1)
stdin:start("r", function() print("uv callback") end)
uv.run("once")
当我手动按下回车键时,一切都按预期进行:
% lua-5.1 min.lua
uv callback
%
但是,通过管道从另一个程序传递空行似乎不起作用:
% echo | lua-5.1 min.lua
-- nothing happens, and lua-5.1 does not exit
我相信,通过额外的测试,这不是一个缓冲问题:编写一个手动刷新以代替echo
并添加io.stdin:setvbuf("no")
到 lua 脚本顶部的程序不会改变行为。 (事实上,从实验上看,它似乎以某种方式直接连接到终端:手动按下 Enter 仍然会导致回调运行并且程序退出!)
为什么我的脚本看不到管道输入的数据,我该如何改变它才能看到它?
标准输入是 FD 0,而不是 FD 1,因此请执行
uv.new_poll(0)
而不是uv.new_poll(1)
。手动按下 Enter 而不是通过管道输入时,它会起作用,原因是如果没有管道,所有标准 FD 都是以读写模式打开的 TTY。