3

仮想マシンで実行すると、何らかの理由で誤動作するコードがあります。

初期化の順序は次のとおりです。

s_listen = socket(...)
bind(s_listen, ...)
epoll_ctl(epfd, EPOLL_CTL_ADD, s_listen, ...)
listen(s_listen, SOMAXCONN)

bindが呼び出される前に、epollファイル記述子にイベントループ/スレッド実行および処理イベントがあります。

そのイベントループは、新しく作成されたs_listenソケットでlisten()を呼び出す前に、EPOLLHUPを取得します。

だから私の質問は、なぜ私は真新しいソケットでEPOLLHUPイベントを取得するのですか?

listen()の呼び出し後にepoll_ctlを配置するとエラーはなくなりますが、ソケットがepollに追加される前に接続イベントが発生した場合、接続イベントが失われる可能性がありますか?

4

1 に答える 1

4

コメントの私の例が示すように、適切に初期化される前にソケットをポーリングできないようですEPOLLHUP

質問に関しては、いいえ、イベントを見逃すことはありません。その場合の呼び出しは、listen()それepoll()以外の場合と同じです ( listen()+ ブロッキングaccept())。これらの呼び出し間の実際の着信接続はカーネルによって処理され、コードがそれらを処理するまで待機します。

于 2013-02-08T05:07:52.833 に答える