Befehl zum Erstellen/Verbinden mit einem E/A-Stream?

Befehl zum Erstellen/Verbinden mit einem E/A-Stream?

Ich versuche also, eine Verbindung zu einem (Lua-)Debugger herzustellen, der in ein Programm eingebettet ist, indem ich die E/A umleite. Derzeit erstelle ich ein Paar FIFOs für die Lese- und Schreibströme und verbinde mich mit ihnen über cat /tmp/dbg_write & cat > /tmp/dbg_read. Das funktioniert und ist ziemlich unkompliziert, aber wenn Sie nicht alles richtig beenden, müssen Sie zurückgehen und den Hintergrundbefehl cat beenden. Ich dachte, es wäre Zeit für eine Lernerfahrung, da es anscheinendmusseinen besseren Weg geben. Ich bin allerdings völlig ratlos.

Intern überschreibe ich einfach dieDebuggerE/A-Funktionen zur Verwendung von FIFOs, da stdio in diesem Fall nicht in Frage kommt. Soweit ich weiß, gibt es keine Möglichkeit, bidirektionale E/A mit den Standard-Lua-APIs wie Sockets durchzuführen, und das Einbinden nativer Bibliotheken ist nicht möglich, da diese eingebettet sind.

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

Ich habe auch versucht:

  • Wird verwendet, popen("netcat -lU")um einen Unix-Domänensocket zu erstellen, aber Pipes sind unidirektional. Derp.
  • Ich verwende ein vorhandenes PTY. Das scheint vielversprechend, aber ich weiß nicht, wie ich eins getrennt von einer Shell erstellen kann, die davon lesen möchte.
  • Mit dem Bildschirm irgendwie eine TTY-Sitzung erstellen, mit der ich interagieren kann. (keine Ahnung …)
  • Suchen nach einem vorhandenen Dienstprogramm, das von einer Datei/Pipe nach stdout und gleichzeitig von stdin nach etwas anderem kopieren kann.

Gibt es etwas Offensichtliches, das ich übersehe?

Antwort1

Sie können zwei virtuelle Terminals Rücken an Rücken erstellen mit socat:

$ socat pty,link=/tmp/lua_end pty,link=/tmp/screen_end

Jetzt können Sie mit Lua einfach aus einer einzigen Datei lesen und schreiben:/tmp/lua_end

In einer anderen Shell führen Sie Folgendes aus:

$ screen /tmp/screen_end

Und das ist es, sie werden verbunden, durch socat.

verwandte Informationen