2017-09-30 11 views
1

私はさまざまな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)

+0

「EINTR」は、一般に、シグナルがepollシステムコールを中断したことを意味します。どの信号が送信されているのか把握し、問題を解決する理由と方法を把握してください。 – bnaecker

+0

この動作が見られる場所でstraceの出力を投稿できますか? – nos

答えて

0

少なくともstrace出力のスニペットを見せていただければもっと助かりました。最低でも、どの割り込みが受信されているかがわかります。

この情報がなければ、あなたのプログラムに何が間違っているか教えていただけません。しかし、私はどのように見つけ出すかを教えてくれます。

まず、straceの出力を見てください。それは、プロセスが受け取る信号であることをあなたに伝えます。

次に、その信号のシグナルハンドラを見てください。持っていない場合は、登録してください。これを行うには、sigactionを使用し、signalを使用していないことを確認してください。また、より新しいsa_sigaction関数形式を使用していることを確認してください。

この形式では、シグナルハンドラがその信号を送信した人に関する情報を受け取ります。送信者のPID、タイマーの場合はタイマーIDなどが含まれます。この情報を使用して、信号がどこから来ているかを判断します。

関連する問題