Команда для создания/подключения к потоку ввода-вывода?

Команда для создания/подключения к потоку ввода-вывода?

Итак, я пытаюсь подключиться к отладчику (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.

Связанный контент