2017-04-30 8 views
2

ノンブロッキング匿名パイプ(O_NONBLOCKフラグ)から読み取るPOSIXスレッドがあります。スレッドが停止しているとき(例えばエラーのために)、パイプ内に(内部バッファ内に)何かが残っているかどうかチェックしたい。パイプにデータがある場合、新しいスレッドはパイプからの読み取りを続けることができるように、同じ読み取りディスクリプタ(スレッド間で共有される)を持つ新しいスレッドを実行します。パイプが空の場合はパイプを閉じ、何もしないでください。ノンブロッキング匿名パイプにデータを削除せずにチェックする方法

パイプからデータを削除せずにパイプが空であるかどうかを確認する必要があります(通常の場合はreadとなります)。それを行う方法はありますか?

P.S.私はread(int fd, void *buf, size_t count);count = 0を設定することが役立つかもしれないと思うが、それは未定義の動作のいくつかの種類であるドキュメント・サイス:カウントがゼロの場合

、(読み)は、以下のエラーを検出することができます。 にエラーがないか、またはread()でエラーがチェックされない場合は、0のカウントを持つ read()が0を返し、それ以外の効果はありません。

+0

Nitpick:ゼロ・サイズのドキュメントを読み込む_implementation-defined_を説明し、定義されていない、動作。未定義の振る舞いは、具体的には、*任意の*結果が正しいことを意味します。私のC教授は、「未定義の動作とは、コンピュータが火を奪うのが技術的に有効である」ということでした。 :) –

+0

また、これは重複しているはずです(前に尋ねられていないとは想像できません)が、良い一致を見つけることはできません。 Hm。 –

+0

@SnildDolkow私は尋ねる前に深く検索しました。 –

答えて

2

ゼロタイムアウトで呼び出されたpollまたはselectと思っています。

ショートselect()のドキュメントからの説明:

select() and pselect() allow a program to monitor multiple file 
    descriptors, waiting until one or more of the file descriptors become 
    "ready" for some class of I/O operation (e.g., input possible). 

...とポーリング()のドキュメント:

poll() performs a similar task to select(2): it waits for one of a 
    set of file descriptors to become ready to perform I/O. 
+0

pollとselectはファイル記述子でのみ機能します。私は名前付きパイプとは異なる匿名パイプを使用します。対応するファイルはありません。 –

+0

'int pipe(int pipefd [2]);'コマンドでパイプを作成します。 –

+0

'pipe()'はファイル記述子を提供します。私は彼らが 'poll()'と 'select()'で動作することを確信しています。 –

関連する問題