2016-04-30 8 views
0

私はFIFOを作成しましたが(mkfifo())、いくつかのプロセスが何回かデータを書き込むまで待つ必要があります。私は、次のコードを書いている:
Linuxで忙しく待たずにfifoを聞いています(C linux)

int count = 0, read = 0; 
while(count < 2) { 
    sleep(2); 
    read = read(fd, buf, BUFFER_SIZE); 
    if(read > 0) { 
     //do work... 
     count++; 
    } 
} 
:(それは簡潔な例を維持することだ、悪いスタイルを無視する)

int count = 0, read = 0; 
while(count < 2) { 
    read = read(fd, buf, BUFFER_SIZE); 
    if(read > 0) { 
     //do work... 
     count++; 
    } 
} 

ビジーウェイトを避けるための試みで、私は次の行を追加しました

(fdはFIFOのディスクリプタです)
しかし、私は本当に好きではない、それは人工的に見えます。それを行うより良い方法はありますか?

+1

これは非常に一般的な状況です:1つ以上のファイル記述子が何かを 'read'するまで' select() 'を使ってブロック(待機)してください。 –

+0

'read = read(...)'これがうまくいくとは思わないでください。 –

答えて

0

通常、がない場合は、O_NONBLOCKフラグを指定してFIFOを開いたは、データが読み込めるまでブロックを読み込みます。だから "睡眠(2);"ステートメントは必要ありません。また、fifoの書き込み終了やシグナル(errno = EINTR)によって中断されたために読み込み呼び出しが返されたなどの理由で、 "if(read> 0)"チェックが必要です。

関連する問題