4

EINTRが原因でepoll_waitが失敗します。私のgdbトレースはこれを示しています:

enter code here
221     in ../nptl/sysdeps/pthread/createthread.c
(gdb) 
224     in ../nptl/sysdeps/pthread/createthread.c
(gdb) 
 [New Thread 0x40988490 (LWP 3589)]

227     in ../nptl/sysdeps/pthread/createthread.c
(gdb) 
epoll_wait error in start timer: Measurement will befor entire duration of execution
epoll_wait: Interrupted system call
[Thread 0x40988490 (LWP 3589) exited]

この文字列「開始タイマーのepoll_waitエラー:測定は実行期間全体にわたって行われます」は、私がstderrに出力します。

epoll_waitが機能するように、このEINTRを修正する方法を理解できません。このEINTRがGDBトレースによってどのように生成されるかについて何か考えはありますか?

4

1 に答える 1

18

特定のシグナルハンドラは、UnixまたはLinuxでの同様のシステムコールを中断epoll_wait()select()ます。これは仕様によるものであるため、これらのシステムコールを中断できます。

直接修正することはできません。一般的な解決策は、EINTRのerrnoを明示的にチェックして、epoll_wait()再度実行することです。

int nr;
do {
    nr = epoll_wait(epfd, events, maxevents, timeout);
} while (nr < 0 && errno == EINTR);

以下も参照してください:gdbエラー:epoll_waitを実行できません:(4)システムコールが中断されました

于 2011-07-29T08:16:23.110 に答える