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

私も次のことを試しました。

  • Unixドメインソケットの作成に使用されますが、popen("netcat -lU")パイプは一方向です。デップ。
  • 既存のptyを使用してください。有望に見えますが、データを読みたいシェルとは別にシェルを作成する方法がわからないということです。
  • 画面を使用すると...何とか対話できるttyセッションが作成されます。 (わからない…)
  • ファイル/パイプからstdoutに、およびstdinから別のものにコピーできる既存のユーティリティを見つけます。

私は明らかなものを見逃していますか?

答え1

あなたができることは、2つの仮想端末を連続して作成することですsocat

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

luaでは、単一のファイルを読み書きするだけです。/tmp/lua_end

他のシェルでは、次のことができます。

$ screen /tmp/screen_end

それはすべてです。彼らはを介して接続されますsocat

関連情報