さまざまな fd のポーリングを担当するスレッドがあります。タイムアウトを設定して epoll_wait を使用しています。以下はコード スニペットです。
do {
n = epoll_wait(epollFd, eventsList, eventsTotal, timeoutMS);
}
while ((n<0) && (errno == EINTR));
eventsList メモリには、timerfd、signalfd、および socket fd が含まれます。
スレッドはうまく機能し、タイマー イベント、ソケットのオープン/読み取り/書き込み/クローズ イベント、およびユーザー定義のシグナル イベントを処理します。
ただし、errno が常にEINTRを返すため、スレッドが無限の do-while ループに陥る場合があります。
スレッドのトップ -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 を使用して、epoll_wait() によって返される errno を取得しようとしました。4(EINTR)です