所以我尝试通过重定向 I/O 连接到嵌入在程序中的 (Lua) 调试器。目前,我为读取和写入流创建一对 FIFO,并使用cat /tmp/dbg_write & cat > /tmp/dbg_read
.这是可行的并且非常简单,但是如果您没有正确退出所有内容,则必须返回并终止后台 cat 命令。我认为是时候进行学习体验了,因为似乎有必须是一个更好的方式。但我完全被难住了。
在内部我只是重写调试器的使用 FIFO 的 I/O 函数,因为在这种情况下 stdio 是不行的。据我所知,没有办法使用标准 Lua API(如套接字)进行双向 I/O,并且拉入本机库是不可能的,因为它是嵌入式的。
local dbg = require("debugger")
local READ_PIPE, WRITE_PIPE = "/tmp/dbg_read", "/tmp/dbg_write"
os.execute(string.format("mkfifo %s %s", READ_PIPE, WRITE_PIPE))
local input, output = io.open(READ_PIPE, "r"), io.open(WRITE_PIPE, "w")
function dbg.read(prompt)
dbg.write(prompt)
return input:read()
end
function dbg.write(str)
output:write(str)
output:flush()
end
我也尝试过:
- 用于
popen("netcat -lU")
创建 Unix 域套接字,但管道是单向的。德普。 - 使用现有的 pty。看起来很有希望,只是我不知道如何创建一个与想要从中读取数据的外壳分开的外壳。
- 使用 screen...以某种方式创建一个我可以与之交互的 tty 会话。 (不知道...)
- 找到一个现有的实用程序,可以从文件/管道复制到标准输出,同时也可以从标准输入复制到另一个。
我缺少什么明显的东西吗?
答案1
您可以做的是创建两个背靠背的虚拟终端socat
:
$ socat pty,link=/tmp/lua_end pty,link=/tmp/screen_end
现在,从 lua 中,您只需读取和写入单个文件:/tmp/lua_end
在另一个 shell 中,您可以执行以下操作:
$ screen /tmp/screen_end
就是这样,他们将通过 进行连接socat
。