Socket

使用像套接字這樣的 pty?

  • May 16, 2015

我正在編寫一組腳本來與外部程序對話。我的問題是腳本僅在短時間內“活動”(由較大程序中的按鍵觸發),但外部程序需要在呼叫之間保持執行,並且最初是為互動式使用而設計的(想想調試器)。

  • 如果我只想編寫一個腳本來執行程序,我會打開一個 PTY 並在上面發送/接收數據。這有效(我的腳本在 LUA 中,lpty 可以處理 PTY),但是當腳本終止時它不能保持程序執行。
  • 如果外部程序為我提供了一個用於連接的套接字(就像 gdb 一樣),我可以將名稱保存在某處,然後讓每個腳本連接到該套接字。但它只是為了互動使用。

我可以編寫一個啟動外部程序的守護程序,打開一個 PTY,然後監聽套接字本身。然後腳本可以連接到守護程序的套接字並發送數據,守護程序將通過 PTY 將數據轉發給程序並將結果發回。

我與外部程序交換的數據格式是基於行的,但我事先不知道我將從單個命令中返回多少行。PTY 不是問題,但更多的工作是luasocket.

我想知道是否沒有更好的方法來做到這一點。我可以以某種方式打開程序的 PTY 並獲取其“地址”,然後我可以從該地址多次連接和斷開我的腳本嗎?(一次只能執行一個腳本,因此並發性不是問題。)這將完全避免使用套接字。

或者是否有一些選項組合socat已經可以做到這一點?

您不能“打開程序的 PTY”。PTY 是一個偽終端;它需要一個終端。如果您想通過終端直接與程序通信,則程序需要創建一個終端(即表現得像一個終端仿真器)。

相反,您可以終端中執行程序,例如screen。Screen 可以輕鬆地從程序中註入輸入和讀取輸出。

但是,對於您正在做的事情,終端會引入無用的複雜性。套接字正是您想要做的事情的正確工具——兩個程序之間的直接雙向通信。(對於單向通信,管道將是正確的工具。)使用終端的唯一優點是,如果您不控制其中一個端點,並且如果輸出不是,它堅持按塊而不是按行緩衝輸出在終端上。

引用自:https://unix.stackexchange.com/questions/203580