2017-01-10 8 views
2

epollセットにfdを追加すると、 'struct epoll_event.data'を使っていくつかの状態を関連付けることができます。 epollがfdでイベントを報告すると、それはもちろん、関連するデータをイベントとともにユーザに返します。これは、epollセットがfdsと関連する状態の間のマッピングを維持していることを意味します。epollのfdと関連状態のマッピング

epoll_event.data.ptrを私が動的に割り当てた状態に設定しているとしましょう。将来、ある時点でepollからfdを削除したいので、先にptrで設定したメモリを解放します。

私が知る限り、上記を達成するためにepollセット内のfdに関連付けられた状態を調べるプログラム的な方法はありません。私は現在、fdsと関連する状態との間の独自のマッピングを維持しています。このマッピングの維持には多くのメモリは必要ありませんが、私はまだ2つの異なる場所で同じマッピングを維持することが非常に効率的ではないと感じています。

私の質問です:epollセット内のfdに関連付けられた状態を取得する方法はありますか?

+0

あなたはepollセットに追加した独自の状態を保持できます。イベントが発生するたびに、ローカルコピーからもイベントを削除し、2つのイベントを同期させておくことができます。 –

+0

削除したいfdを閉じるだけで、epoll_waitでそのfdとあなたのデータをERR/HUP/INVAL状態で返すことができますか? – Useless

+0

良いアイデアだけど、私はfdを閉じたくありません。私はレベルのトリガを使用する必要がありますが、特定の状況では、fdが読み込み可能かどうかは気にしません。私は私のロジックを書き直してepollセットからfdを削除する必要がないようにします。 – Akhi

答えて

2

いいえ、オンデマンドで状態を取得する方法はありません。関連付けられた状態は、記述子にepoll_waitウェイクアップがある場合にのみ返されます。

いくつかの古い技術フォーラムを読み返しても、この同じ問題は特にClumsy interface of epollというスレッドで議論されました。基本的には、可能な解決策としてEPOLL_CTL_GETインターフェースが提案されているが、ユーザー空間コードでのマッピングを維持することはかなり必要であると主張されていた。

理由としてスレッドに明示的には記載されていませんが、登録されたディスクリプタについて考慮する必要があるのは、ディスクリプタが閉じられた場合、登録解除が自動的に行われることです。 †残念ながら、epoll_waitから "記述子が暗黙的に登録解除されました"という起床はありません。

EPOLL_CTL_GETインターフェイスが、events引数をconstのスレッドepoll_ctl and const correctnessのままにする理由として仮定されていることがわかります。

;Assuming all its duplicates are closed as well.

+0

リンクありがとうございます。それは面白く面白い読書でした。私はこの問題を思い付く最初の人ではなかったことを嬉しく思っています。好奇心のために、どうやってメールスレッドを見つけましたか?私は質問を投稿する前にGoogleの検索を試みたが、多分私のgoogle-fuは十分ではなかった。 – Akhi

+0

私は最初にEPOLL_CTL_GETを提案できるとコメントしましたが、それまでに提案されていたかどうかを調べました。 – jxh

関連する問題