FIFO を通過したデータをどのように監視する必要がありますか? モニターがすべてのバイトを読み取ると、データを必要とする実際のプログラムがデータの受信に失敗するため、単に開いて監視を続けるだけでは機能しません。
2 に答える
次のシステム コールのいずれかを使用する必要があります。
select()- ソース: man -s 2 select
pselect()- ソース: man -s 2 pselect
select() と pselect() を使用すると、プログラムは複数のファイル記述子を監視し、1 つまたは複数のファイル記述子が何らかのクラスの I/O 操作 (たとえば、入力可能) に対して「準備完了」になるまで待機できます。ブロックせずに対応する I/O 操作 (たとえば、read(2)) を実行できる場合、ファイル記述子は準備完了と見なされます。
これらはすべて I/O ブロッキング呼び出しであることに注意してください。
ppoll()- man -s 2 ppoll
poll()- man -s 2 投票
システムコールの両方のセットの違いも読んでください:http://www.unixguide.net/network/socketfaq/2.14.shtml
pselect または ppoll を使用することは、より安全に使用するために常に select および poll よりも優れています。
そこにあるFIFOの種類はわかりませんが(パイプ?ソケット?一般的に質問について詳しく説明する必要があります)、前方読み取りについて知っている唯一のケースはソケットです。
次の効果を持つrecv()
フラグで使用できます。MSG_PEEK
このフラグにより、受信操作は、キューからデータを削除せずに、受信キューの先頭からデータを返します。したがって、後続の受信呼び出しは同じデータを返します。
ソケットを使って IPC を実装することもできるので ( unix(7) )、それらをプロジェクトに追加することをお勧めします (linux/unix を使用している場合)。ソケットの使用方法を知りたい場合は、man ページを読む必要があります: socket(2)およびsocket(7)または Windows の場合recv()
はsocket()
.
また、2 つの FIFO を使用して、1 つはモニターに、もう 1 つはモニターから実際のプログラムに使用することもできます。次に、すべての受信データをモニターで読み取り、関連する部分をフィルター処理して、実際のプログラムに直接書き込みます。これは、実際のプログラム内に複数のレシーバーがあり、受信データを分割したい場合に便利です。
読み取るデータがあるかどうかを知りたいだけの場合は、select(2) または pselect(2)またはpoll(2)を使用できます。select()