私はいくつかの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の数ではありません)。
はあなたの選択のスレッドがあることを確認しています'select'ではブロックされ、' read'ではブロックされませんか? – user2807083
はい、読み取りと選択の前後にいくつかのログを追加しました。 –
'write'の戻り値を確認しましたか? – user2807083