![Comando para criar/conectar a um fluxo de E/S?](https://rvso.com/image/170264/Comando%20para%20criar%2Fconectar%20a%20um%20fluxo%20de%20E%2FS%3F.png)
Então, estou tentando me conectar a um depurador (Lua) incorporado em um programa redirecionando a E/S. Atualmente eu crio um par de FIFOs para os fluxos de leitura e gravação e me conecto a eles usando cat /tmp/dbg_write & cat > /tmp/dbg_read
. Isso é viável e bastante simples, mas se você não sair de tudo corretamente, terá que voltar e eliminar o comando background cat. Achei que era hora de uma experiência de aprendizado, já que parece quedeveser um caminho melhor. Estou totalmente perplexo.
Internamente estou apenas substituindo odepuradorFunções de E/S para usar FIFOs, já que stdio é proibido neste caso. Até onde eu sei, não há como fazer E/S bidirecional com as APIs Lua padrão, como soquetes, e extrair bibliotecas nativas é impossível, pois está incorporado.
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
Eu também tentei:
- usando
popen("netcat -lU")
para criar um soquete de domínio Unix, mas os pipes são unidirecionais. Derp. - Usando um pty existente. Parece promissor, exceto que não sei como criar um separado de um shell que deseja lê-lo.
- Usando screen para... de alguma forma criar uma sessão tty com a qual eu possa interagir. (nenhuma idéia...)
- Encontrar um utilitário existente que possa copiar de um arquivo/pipe para stdout e ao mesmo tempo copiar de stdin para outro.
Alguma coisa óbvia que estou perdendo?
Responder1
O que você pode fazer é criar dois terminais virtuais, consecutivos, com socat
:
$ socat pty,link=/tmp/lua_end pty,link=/tmp/screen_end
Agora, em lua, basta ler e escrever em um único arquivo:/tmp/lua_end
Em outro shell você faz:
$ screen /tmp/screen_end
E é isso, eles vão estar conectados, através do socat
.