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

당신이 할 수 있는 일은 두 개의 가상 터미널을 연속해서 만드는 것입니다 socat.

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

이제 lua에서는 단일 파일을 읽고 쓰기만 하면 됩니다./tmp/lua_end

다른 셸에서는 다음을 수행할 수 있습니다.

$ screen /tmp/screen_end

그게 다입니다. 그들은 를 통해 연결될 것입니다 socat.

관련 정보