でkqueueを作成するとkqueue()、ファイル記述子が返されます。しかし、このファイル記述子は で意味のあるポーリングを行うことができないようselect()です。からポーリング/読み取りを行う標準的なkqueue()方法はを使用していることを理解していkevent(...)ますが、 を使用してファイル記述子をポーリングするレガシー コードと統合しようとしていますselect()。
ここでの目標は、このベースのポーリング メカニズムで検出できる「ユーザー イベント」を起動できるようにすることでしたselect(イベントを後で使用して「消費」する必要がある場合でもkevent())。EVFILT_USERこれは、この種のことを行うために生まれたように見えましたが、簡単な実験ではselect()、イベントが kqueue に追加 (およびトリガー) されたときに、kqueue の fd が読み取り可能であると報告されず、タイムアウト (またはブロック) するだけであることが示されています。永遠に)。(しかし、同等のkevent()呼び出しはイベントを参照/返します。)
私は何か間違ったことをしていますか?それとも、kqueue の fd を でポーリングすることはできませんselect()か?