I/O ストリームを作成/接続するコマンドですか?

I/O ストリームを作成/接続するコマンドですか?

そこで、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

関連情報