![¿Comando para crear/conectarse a una secuencia de E/S?](https://rvso.com/image/170264/%C2%BFComando%20para%20crear%2Fconectarse%20a%20una%20secuencia%20de%20E%2FS%3F.png)
Así que estoy intentando conectarme a un depurador (Lua) integrado en un programa redirigiendo la E/S. Actualmente creo un par de FIFO para las secuencias de lectura y escritura y me conecto a ellos mediante cat /tmp/dbg_write & cat > /tmp/dbg_read
. Esto es viable y bastante sencillo, pero si no sale de todo correctamente, tendrá que regresar y eliminar el comando cat en segundo plano. Pensé que era hora de vivir una experiencia de aprendizaje ya que parece quedebeser una mejor manera. Aunque estoy totalmente perplejo.
Internamente simplemente estoy anulando eldel depuradorLas funciones de E/S utilizan FIFO, ya que stdio es imposible en este caso. Hasta donde yo sé, no hay forma de realizar E/S bidireccional con las API de Lua estándar, como los sockets, y incorporar bibliotecas nativas no es posible ya que está integrada.
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
También probé:
- Se utiliza
popen("netcat -lU")
para crear un socket de dominio Unix, pero las tuberías son unidireccionales. Derp. - Usando un pty existente. Parece prometedor, excepto que no sé cómo crear uno separado de un shell que quiera leerlo.
- Usando la pantalla para... de alguna manera crear una sesión tty con la que puedo interactuar. (ni idea...)
- Encontrar una utilidad existente que pueda copiar desde un archivo/tubería a la salida estándar y al mismo tiempo copiar desde la entrada estándar a otro.
¿Algo obvio que me falta?
Respuesta1
Lo que puedes hacer es crear dos terminales virtuales, espalda con espalda, con socat
:
$ socat pty,link=/tmp/lua_end pty,link=/tmp/screen_end
Ahora, desde lua, simplemente lees y escribes desde un único archivo:/tmp/lua_end
En otro shell haces:
$ screen /tmp/screen_end
Y listo, van a estar conectados, a través de socat
.