2 つのプロセス間通信に使用される擬似端末

2 つのプロセス間通信に使用される擬似端末

第三者Cライブラリ(libmodbus重要な場合)シリアルデバイス(私の場合は/dev/ttyUSB0FTDIチップセットベースのUSB-RS485アダプタを介してRS-485などのデバイス)を介して通信します。 CLIパラメータに基づくこの実行可能ファイルは、コマンドを実行して(私の場合はModbusクライアントのように)応答を待つか(私の場合は外部Modbusサーバーから)、着信コマンドを受け取ることができます(私の場合は例(Modbusサーバー)その後、応答を生成します。

外部デバイスなしで自動的に実行可能ファイルをテストしたいと思います。つまり、実行可能ファイルの2つのインスタンスを起動しようとします。

  • /dev/xxxx最初のインスタンスはModbusクライアントモードに入り、通信に使用されます。
  • 2番目のインスタンスはModbusサーバーモードになり、/dev/yyyy通信に使用されます。
  • 設定/dev/xxxxし、/dev/yyyy両方ともシリアルデバイスとして動作し、基本的に同じワイヤの両端です。

私が読んだことからpty マンページ、私は疑似端末の2つの端だと/dev/xxxx思います。/dev/yyyyこれは私の質問につながります。

  1. マニュアルページはBSDスタイルの擬似端末を参照していますが、これは私が望む作業に適しています。
    • BSDスタイルの擬似端末を正しく理解していますか?
    • それでは、BSDではなくLinuxディストリビューションでBSDスタイルの擬似端末を作成することは可能ですか?特に私はdebian 10、11、12(およびUbuntu 20.04、22.04などのdebianベースのバージョン)を使用しています。
  2. マニュアルページには、使用されるUNIX 98擬似端末も参照されていますposix_openpt()。ただし、その後もgrantpt()クライアント unlockpt()はpty用のデバイスのみを提供できます。マスターは実行可能ファイル内のファイル記述子にすぎません。/dev/pts
    • 私の理解は(緩やかに基づいて次のコード)正しいですか?
    • それでは、基本的な側面ファイル記述子を使用/dev/xxxx可能な唯一のAPIである正しいファイル記述子に変換するためにどのようなトリックを使用できますか?Modbus コンテキストのインポート
  3. 私が望むことをすることができる他の「標準」Linuxツールはありますか?このようなツールここで言及されているもの実行可能ファイルのSTDIOがptyに接続されることを期待しています。

答え1

以下を使用してPTY「仮想シリアルポート」を設定できます.socat

socat \
  pty,rawer,echo=0,link=/tmp/portA \
  pty,rawer,echo=0,link=/tmp/portB

これにより、2つのPTYデバイスとこれらのデバイスへの2つのシンボリックリンクが作成されます。私のシステムでは、上記のコマンドは以下を生成します。

$ ls -l /tmp/port*
lrwxrwxrwx 1 lars lars 11 Jul 24 11:49 /tmp/portA -> /dev/pts/20
lrwxrwxrwx 1 lars lars 11 Jul 24 11:49 /tmp/portB -> /dev/pts/21

これらの pty デバイスをシリアルポートと考えることができます。たとえば、slcand次のデバイスに接続してCANbusインターフェイスを作成できます。

slcand -o -c -f -s6 $(readlink /tmp/portA)
slcand -o -c -f -s6 $(readlink /tmp/portB)

または、picocom各ポートに接続して仮想リンクを介してチャットすることもできます。 1つのウィンドウで:

picocom $(readlink /tmp/portA)

別のウィンドウで:

picocom $(readlink /tmp/portB)

など。


UNIX-98 ptyとBSDスタイルのptyは同じように動作します。違いは割り当て方法にあります(UNIX-98 ptyは動的に割り当てられ、BSDスタイルのptyは事前に割り当てられたデバイスです)。

ただし、後続の grantpt() および Unlockpt() の後でも、クライアントは pty 用の /dev/pts デバイスのみを提供でき、マスターは実行可能ファイル内のファイル記述子にすぎません。

これは正しいです。 2つのptyを接続して仮想シリアルラインを生成するには、コードで両方のptyデバイスを開き、2つの間のデータ移動を処理する必要があります(socat上記の例で行われた作業)。

関連情報