私はさまざまなfdをポーリングするスレッドを持っています。タイムアウトを設定してepoll_waitを使用しています。続き は、コードスニペットです:epoll_wait()はEINTRを無限に返します
do {
n = epoll_wait(epollFd, eventsList, eventsTotal, timeoutMS);
}
while ((n<0) && (errno == EINTR));
eventsListメモリはtimerfd、はsignalfdとソケットのfdが含まれています。
スレッドはうまく動作します。タイマイベント、ソケットオープン/リード/ライト/クローズイベント&ユーザ定義シグナルイベントを処理します。
しかし、スレッドが無限のdo-whileループに入るときは、errnoは常にを返します。EINTR。
スレッドのトップ-Hは、スリープ状態を示します。 straceはループ内で epoll_wait()を呼び出していることがわかります。
私はよく受け入れられる取り扱い方法を使用しているので、何が問題になる可能性がありますか? epoll_wait & EINTR?上記の問題の原因となるソケットの読み書き/クローズに何か問題がありますか?またはtimerfd?
更新: のstrace -p出力:
epoll_wait(8, {}, 8192, 10) = 0
epoll_wait(8, {}, 8192, 10) = 0
epoll_wait(8, {}, 8192, 10) = 0
epoll_wait(8, {}, 8192, 10) = 0
それから私は)のgcoreを取って、errnoはイベントがepoll_wait(によって返さ取得しようとしました。 4(EINTR)
「EINTR」は、一般に、シグナルがepollシステムコールを中断したことを意味します。どの信号が送信されているのか把握し、問題を解決する理由と方法を把握してください。 – bnaecker
この動作が見られる場所でstraceの出力を投稿できますか? – nos