我的用户空间模块接收EINTR信号,后不知何故有时应用。如何处理EINTR(系统调用被中断)
我什么记录使用Strace:
time(NULL) = 1257343042
time(NULL) = 1257343042
rt_sigreturn(0xbff07be4) = -1 EINTR (Interrupted system call)
--- SIGALRM (Alarm clock) @ 0 (0) ---
time(NULL) = 1257343042
futex(0xb7cea80c, 0x80 /* FUTEX_??? */, 2) = ? ERESTARTSYS (To be restarted)
--- SIGUSR1 (User defined signal 1) @ 0 (0) ---
sigreturn() = ? (mask now [ALRM])
futex(0xb7cea80c, 0x80 /* FUTEX_??? */, 2) = ? ERESTARTSYS (To be restarted)
--- SIGWINCH (Window changed) @ 0 (0) ---
futex(0xb7cea80c, 0x80 /* FUTEX_??? */, 2) = ? ERESTARTSYS (To be restarted)
--- SIGTERM (Terminated) @ 0 (0) ---
time(NULL) = 1257343443
time(NULL) = 1257343443
futex(0xb7cea80c, 0x80 /* FUTEX_??? */, 2) = ? ERESTARTSYS (To be restarted)
--- SIGWINCH (Window changed) @ 0 (0) ---
futex(0xb7cea80c, 0x80 /* FUTEX_??? */, 2
我能赶上EINTR信号,我怎么能重复来电关注诸如写入,读取或选择?即使我使用第三方库处理系统调用,如何确定发生了这个EINTR?
为什么我的应用程序接收到EINTR(:我发了SIGUSR1通常的处理方式,请参阅strace转储)之后被完全阻塞?为什么futex()将ERESTARTSYS返回给用户空间?
感谢
讨论EINTR不是信号但在一个系统调用信号中断的错误数返回。 – 2009-11-04 15:06:22
使用'gstack'或'gdb'获取堆栈跟踪,找出程序当前停滞的地方。 – mark4o 2009-11-04 16:08:01