刚刚遇到未记录的错误。对
poll()
的呼叫返回 ECHILD
。
我有一个非常简单的代码,几乎直接来自该人:
struct pollfd fds[] = { fd, POLLIN, 0 };
while(should_continue) {
int rc=poll(fds, 1, 1000);
if(rc==0) {
// exit by timeout, repeat waiting
continue;
} else if(rc<0) {
printf("poll error %d\n", errno);
exit(1);
}
// read from fd
}
此代码突然退出并显示“轮询错误 10”。但
man 2 poll
甚至没有提到 ECHILD 可能是错误。可能是什么原因?
很少有东西能返回
ECHILD
。
因此,我怀疑你的信号处理程序会破坏
errno
。具体来说,是处理 SIGCHLD
并调用 wait
直到返回 -1
。
发生的事情是这样的:
poll
,它就会阻塞。poll
返回 -1
并带有错误 EINTR
,以便让您的信号处理程序有机会运行。SIGCHLD
处理程序已被呼叫。wait
来收割任何等待收割的孩子。wait
,没有任何收获,返回 -1
,并出现错误 ECHILD
。SIGCHLD
处理程序返回 ,而不恢复 errno
。poll
当它真正返回ECHILD
时,似乎返回了错误EINTR
。修复:
errno
,并在退出前恢复它。poll
并出现错误-1
时重新启动EINTR
(或者使其在信号处理后自动重新启动)。