web-dev-qa-db-ja.com

ソケットのようなptyを使用していますか?

私は外部プログラムと通信するためのスクリプトのコレクションを書いています。私の問題は、スクリプトが短時間だけ「生きている」(大きなプログラムでキーを押すことによってトリガーされる)が、外部プログラムは呼び出し間で実行し続ける必要があり、元々はインタラクティブに使用するように設計されていることです(デバッガーを考えてください)。

  • プログラムを実行するための単一のスクリプトを作成したいだけの場合は、それにPTYを開いて、そのスクリプトでデータを送受信します。これは機能しますが(私のスクリプトはLUAにあり、lptyはPTYを処理できます)、スクリプトの終了時にプログラムを実行し続けることはできません。

  • 外部プログラムが接続するソケットを提供してくれた場合(gdbのように)、名前をどこかに保存して、各スクリプトをそのソケットに接続させることができます。しかし、それはインタラクティブに使用することだけを目的としていました。

外部プログラムを起動し、それにPTYを開いてから、ソケット自体をリッスンするデーモンを作成できます。次に、スクリプトはデーモンのソケットに接続してデータを送信し、デーモンはそれをPTYを介してプログラムに転送し、結果を送り返します。

外部プログラムと交換するデータの形式は行ベースですが、1つのコマンドから何行返されるかは事前にわかりません。 PTYの問題ではありませんが、luasocketでもう少し作業が必要です。

これを行うためのより良い方法はないのだろうかと思います。どういうわけか、プログラムへのPTYを開いてその「アドレス」を取得できますか?このアドレスから、後でスクリプトに何度も接続したり切断したりできますか? (一度に実行できるスクリプトは1つだけなので、同時実行性は問題になりません。)これにより、ソケットの使用をまったく回避できます。

または、socatにオプションの組み合わせがあり、これはすでに正確に実行されていますか?

2
Bristol

「プログラムに対してPTYを開く」ことはできません。 PTYは疑似端末です。ターミナルエンドが必要です。端末を介してプログラムと直接通信する場合、プログラムは端末を作成する必要があります(つまり、端末エミュレーターのように動作します)。

代わりに、 screen などのターミナルでプログラムで実行できます。画面を使用すると、プログラムからの入力の挿入と出力の読み取りが簡単になります。

しかし、あなたがしていることに対して、端末は役に立たない複雑さをもたらします。ソケットは、2つのプログラム間の直接双方向通信という目的にぴったりのツールです。 (単方向通信の場合、パイプが適切なツールになります。)端末を使用する唯一の利点は、一方の端を制御せず、出力がそうでない場合はラインではなくブロックごとに出力をバッファリングすることを要求する場合です。ターミナルで。