I/O 스트림을 생성/연결하는 명령?

I/O 스트림을 생성/연결하는 명령?

그래서 I/O를 리디렉션하여 프로그램에 포함된 (Lua) 디버거에 연결하려고 합니다. 현재 저는 읽기 및 쓰기 스트림을 위한 한 쌍의 FIFO를 생성하고 cat /tmp/dbg_write & cat > /tmp/dbg_read. 이것은 실행 가능하고 매우 간단하지만 모든 것을 올바르게 종료하지 않으면 돌아가서 배경 cat 명령을 종료해야 합니다. 있을 것 같아서 학습 경험을 할 시간이라고 생각했습니다.~ 해야 하다더 나은 방법이 되십시오. 그래도 나는 완전히 당황했습니다.

내부적으로 나는 단지디버거FIFO를 사용하는 I/O 함수입니다. 이 경우 stdio는 사용할 수 없기 때문입니다. 내가 아는 한, 소켓과 같은 표준 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를 사용합니다. 읽기를 원하는 쉘과 별도로 생성하는 방법을 모른다는 점을 제외하면 유망한 것 같습니다.
  • 화면을 사용하여... 어떻게든 상호작용할 수 있는 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.

관련 정보