コンソールのように動作するプログラムの作成と実行

コンソールのように動作するプログラムの作成と実行

無線送受信機 (NRF24L01) を使用して、2 つのデバイスをシリアル インターフェイス経由で接続されているかのように接続することを目的として、一連のプログラムを作成しました。

現在、bash コマンドを一方向、つまりデバイス A から B に送信できます。デバイス A は現在 AVR マイクロコントローラです。

私の B デバイスは Rapberry Pi です。次のコマンドを使用して、受信したテキストを bash にパイプします。これにより、コマンドは送信できますが、その出力を A デバイスに送り返すことはできません。

./program | bash

bash からの出力を自分のプログラムにパイプして戻す際に、ブロックせずに、受信したデータにプログラムが反応するのを防ぐ方法がわかりません。双方向にパイプを設定できる場合でも、fgetsブロックしているような関数は使用できないと思います。

両方のデバイスは送信機能と受信機能に同じライブラリを共有しており、これらの送信関数と受信関数は、非ブロッキングにするオプションを使用して呼び出すことができます。

答え1

最も簡単な方法は、プログラムでpipe23回実行して3つのパイプを作成します(それぞれstdin、stdout、stderr用)。おそらく非ブロッキングモードで実行したいでしょう。次にforkして、子プロセスに使用させます。dup2パイプをファイル記述子0、1、2に配置する。子プロセスは、エグゼクティブファミリー走るbash

親はselect読み取るデータや書き込むスペースがあるかどうかを判断します。

おそらく、活用できるライブラリや既存の実装があるでしょう。

注 #1:pipe2パイプの読み取り側と書き込み側の 2 つのファイル記述子を返します。たとえば、bash の stdin の場合、bash は読み取り側 (入力を読み取るため) を必要とし、プログラムは書き込み側 (bash の入力を書き込むため) を必要とします。bash の stdout はその逆で、bash は書き込み側を必要とし、プログラムは読み取り側を必要とします。

注 2: これでは完全なターミナル エクスペリエンスは得られません。そのためには pty を扱う必要があり、複雑さが増します (正直言って調べる必要があります)。それをお望みなら、まずは同様のプログラムを探すことをお勧めします。

関連情報