
そこで、I/Oをリダイレクトしてプログラムに埋め込まれた(Lua)デバッガに接続しようとしています。現在、読み取りストリームと書き込みストリーム用にFIFOのペアを作成し、を使用して接続していますcat /tmp/dbg_write & cat > /tmp/dbg_read
。これは実行可能で非常に簡単ですが、すべてを適切に終了しないと、戻ってバックグラウンドのcatコマンドを強制終了する必要があります。しなければならないもっと良い方法があるはずです。でも、まったく困惑しています。
内部的には、デバッガーのこの場合、stdio は使えないので、FIFO を使用する I/O 関数が必要です。私の知る限り、ソケットなどの標準 Lua API で双方向 I/O を実行する方法はなく、ネイティブ ライブラリを取り込むことは埋め込まれているためできません。
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 を使用します。有望に思えますが、そこから読み取りたいシェルとは別に pty を作成する方法がわかりません。
- screen を使用して、対話できる tty セッションを何らかの方法で作成します。(わかりません...)
- ファイル/パイプから stdout にコピーすると同時に、stdin から別のファイルにコピーできる既存のユーティリティを見つけます。
私が見逃している明らかなことはありますか?
答え1
次のようにして、2 つの仮想端末を連続して作成することができますsocat
。
$ socat pty,link=/tmp/lua_end pty,link=/tmp/screen_end
これで、lua から 1 つのファイルを読み書きするだけになります。/tmp/lua_end
別のシェルでは次の操作を実行します。
$ screen /tmp/screen_end
以上で、 を通じて接続されますsocat
。