15

私はさまざまな Linux 名前付きパイプ クライアント/サーバーの実装を経験しましたが、それらのほとんどは読み取り/書き込みでブロックの既定値を使用します。

私はすでに poll() を使用して他のフラグをチェックしているので、poll() を介して着信 FIFO データをチェックすることもお勧めします...

すべての調査の結果、パイプを O_RDWR モードで開くことが、ライターがパイプを開いていない場合に、パイプでの無制限の数の EOF イベントを防ぐ唯一の方法であると思います。

このようにして、パイプの両端が閉じられ、他のクライアントも書き込み可能な端を開くことができます。返信するには、別のパイプを使用します...

私の問題は、O_RDWR フラグを使用する例をいくつか見つけましたが、open() マンページでは、このフラグが FIFO に割り当てられたときに未定義であると説明されていることです。( http://linux.die.net/man/3/open )

しかし、O_RDWR のないパイプで poll() をどのように使用しますか? 「O_RDWR」はパイプを開く正当な方法だと思いますか???

4

3 に答える 3

1

open(2)の man ページによると、 syscall がブロックされるのを回避するO_RDONLY|O_NONBLOCK か、渡すことができます (その場合は取得されます) 。O_WRONLY|O_NONBLOCKopenerrno == ENXIO

私がコメントしたように、fifo(7)mkfifo(3)の man ページも読んでください。

于 2013-02-25T08:59:20.077 に答える
0

O_RDONLY と並んで、読み取りプロセスで開いている O_WRONLY ファイル記述子を保持するだけです。これにより同じ効果が得られ、read() が決してファイルの終わりを返さず、poll() と select() がブロックされることが保証されます。

そして、それは 100% POSIX です

于 2021-01-10T00:07:44.210 に答える