2016-07-08 17 views
2

私はいくつかのfdsの読み書きをチェックする小さなioサービスを構築しています。パイプ+選択:目を覚ますことはありません

これを行うには、タイムアウトなしでselectに専用のスレッドがあり、fdが利用可能になったときにselectだけが起動します。

ただし、特定のイベントでselectを強制的に起動させたい場合があります。そうするために、私は単にパイプを使用し、読み込み可能性を監視し、選択呼び出しを起きたいときに書き込みます。

これはほとんどの場合動作しますが、パイプに書き込むときに何も起こらないことがあります。したがって、選択呼び出しは無期限にブロックされたままです。ここで

は、私が使用したコードの一部です:

選択スレッド:

FD_ZERO(&rd_set); 
//! set some other fds... 
FD_SET(m_notif_pipe_fds[0], &rd_set); 
select(max_fd + 1, &rd_set, &wr_set, nullptr, nullptr); 
if (FD_ISSET(m_notif_pipe_fds[0], &rd_set)) { 
    char buf[1024]; 
    read(m_notif_pipe_fds[0], buf, 1024); 
} 

スレッドに通知:

write(m_notif_pipe_fds[1], "a", 1); 

max_fd変数が効果的に最高のFD値に設定されています(一般的なエラーであるfdの数ではありません)。

+1

はあなたの選択のスレッドがあることを確認しています'select'ではブロックされ、' read'ではブロックされませんか? – user2807083

+0

はい、読み取りと選択の前後にいくつかのログを追加しました。 –

+0

'write'の戻り値を確認しましたか? – user2807083

答えて

2

私はあなたのパイプを参照してください1

int pipe_sz = fcntl(m_notif_pipe_fd[1], F_SETPIPE_SZ, 1); 

int flags = fcntl(m_notif_pipe_fd[1], F_GETFL, 0); 
assert(flags != -1);  
fcntl(m_notif_pipe_fd[1], F_SETFL, flags | O_NONBLOCK); 

と設定し、パイプのバッファサイズを非ブロックにするために、あなたをお勧めしたい this question

+0

素晴らしい、まさに私が探していたもの、ありがとう! –

関連する問題