代码之家  ›  专栏  ›  技术社区  ›  Daniel Wagner

如何使用带有管道的luv?

  •  1
  • Daniel Wagner  · 技术社区  · 5 月前

    我正在尝试使用 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")
    

    当我手动按下enter键时,一切按预期工作:

    % 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键仍会导致回调运行和程序退出!)

    为什么我的脚本看不到管道中的数据,我该如何更改它才能看到?

    1 回复  |  直到 5 月前
        1
  •  1
  •   Joseph Sible-Reinstate Monica    5 月前

    标准输入是FD 0,不是FD 1,所以也是 uv.new_poll(0) 而不是 uv.new_poll(1) 。当您手动按下Enter键而不是管道时,它起作用的原因是,在没有管道的情况下,所有标准FD都是以读写模式打开的TTY。