![Команда для создания/подключения к потоку ввода-вывода?](https://rvso.com/image/170264/%D0%9A%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F%2F%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BA%20%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D1%83%20%D0%B2%D0%B2%D0%BE%D0%B4%D0%B0-%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%D0%B0%3F.png)
Итак, я пытаюсь подключиться к отладчику (Lua), встроенному в программу, перенаправляя ввод-вывод. В настоящее время я создаю пару FIFO для потоков чтения и записи и подключаюсь к ним с помощью cat /tmp/dbg_write & cat > /tmp/dbg_read
. Это работоспособно и довольно просто, но если вы не выйдете из всего сразу, вам придется вернуться и завершить фоновую команду cat. Я решил, что пришло время для опыта обучения, поскольку, похоже, тамдолженбыть лучшим способом. Я в полном замешательстве.
Внутренне я просто переопределяюотладчикФункции ввода-вывода для использования FIFO, поскольку stdio в этом случае не подходит. Насколько мне известно, нет способа сделать двунаправленный ввод-вывод с помощью стандартных API Lua, таких как сокеты, а использование собственных библиотек не подходит, поскольку они встроены.
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, но каналы однонаправленные. Derp. - Использование существующего pty. Кажется многообещающим, но я не знаю, как создать его отдельно от оболочки, которая хочет читать из него.
- Использование экрана для... создания сеанса tty, с которым я могу взаимодействовать. (без понятия...)
- Поиск существующей утилиты, которая может копировать данные из файла/конвейера в stdout, а также копировать данные из stdin в другой.
Есть ли что-то очевидное, что я упускаю?
решение1
Что вы можете сделать, так это создать два виртуальных терминала, расположенных друг за другом, с помощью socat
:
$ socat pty,link=/tmp/lua_end pty,link=/tmp/screen_end
Теперь из lua вы просто читаете и пишете в один файл:/tmp/lua_end
В другой оболочке вы делаете:
$ screen /tmp/screen_end
И все, они будут связаны через socat
.