2016-05-07 4 views
2

RDWR(通信プロセスプロセス用)とパイプ(プロセススレッド)としてFIFOをオープンしています。私が64 KB以上の書き込みをしようとすると、write()で待機します。c - pipe/fifoがいっぱいであるかどうかを理解する

pipe2(fds, O_NONBLOCK); 

やパイプを作成した後、あなたがそれを行う必要がある場合:

int flags = fcntl(fd, F_GETFL, 0); 
fcntl(fd, F_SETFL, flags | O_NONBLOCK); 

今、あなたが読み取りまたは書き込み操作ができないときは、非ブロックモードを使用する必要が

+3

パイプの仕組み。書き込み時にパイプがいっぱいになると、データがパイプから "削除"されるまで、 'write'がブロックされます。 –

+4

ノンブロッキングを開き、 'write'の結果をテストします。 – Olaf

答えて

3

すぐに完了すると、それは返されます。 select()またはpoll()を使用して、読み取りまたは書き込みが可能なときを再度見つけることができます(またはビジーウェイトだけでもかまいません)。

+3

それは '-1'を返し、' EAGAIN'に 'errno'をセットします - POSIX [' write() '](http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html) は言う:{PIPE_BUF}バイト以下の書き込み要求は、パイプに十分な空き容量があれば、すべてのデータを転送し、要求されたバイト数を返す。それ以外の場合、write()はデータを転送せず、errnoを[EAGAIN]に設定して-1を返します。.0 –

+2

引用した記述は 'O_NONBLOCK'フラグが設定されたパイプまたはFIFOに適用されることに注意してください。他の状況下での動作の仕様。 –

関連する問題