Comando para criar/conectar a um fluxo de E/S?

Comando para criar/conectar a um fluxo de E/S?

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.

informação relacionada