使用 pty 像套接字一样?

使用 pty 像套接字一样?

我正在编写一组脚本来与外部程序对话。我的问题是,脚本仅“活动”很短的时间(由较大程序中的按键触发),但外部程序需要在调用之间保持运行,并且最初是为交互式使用而设计的(想想调试器)。

  • 如果我只想编写一个脚本来运行该程序,我会打开一个 PTY 并在其上发送/接收数据。这是可行的(我的脚本位于 LUA 中,并且 lpty 可以处理 PTY),但是当脚本终止时它无法保持程序运行。

  • 如果外部程序为我提供了一个要连接的套接字(就像 gdb 那样),我可以将名称保存在某处,然后让每个脚本连接到该套接字。但它只是为了交互使用。

我可以编写一个守护程序来启动外部程序,打开一个 PTY,然后监听套接字本身。然后,脚本可以连接到守护程序的套接字并发送数据,守护程序将通过 PTY 将数据转发到程序并将结果发回。

我与外部程序交换的数据格式是基于行的,但我事先不知道我将从单个命令中返回多少行。 PTY 不是问题,但luasocket.

我想知道是否有更好的方法来做到这一点。我能否以某种方式打开程序的 PTY 并获取其“地址”,以便稍后可以从脚本中多次连接和断开连接? (一次只能运行一个脚本,因此并发不是问题。)这将完全避免使用套接字。

或者是否有一些选项的组合socat已经可以做到这一点?

答案1

您无法“打开程序的 PTY”。 PTY 是一个伪终端;它需要一个终端。如果您想通过终端直接与程序通信,则该程序需要创建一个终端(即表现得像终端模拟器)。

相反,您可以运行该程序终端,例如屏幕。 Screen 可以轻松地注入输入并读取程序的输出。

然而,对于你正在做的事情,终端会带来无用的复杂性。套接字正是您想要做的事情的正确工具——两个程序之间的直接双向通信。 (对于单向通信,管道将是正确的工具。)使用终端的唯一优点是,如果您不控制其中一端,并且如果输出不控制,它坚持按块而不是按行缓冲输出在终端上。

相关内容