我正在使用epoll进行网络编程。我遇到了分段错误错误,但是由于它是在多线程上运行的,因此很难通过使用日志来找到它确切地在哪里得到错误。
我试图使用gdb,以便可以看到堆栈跟踪。如果我在gdb上运行此命令,那么我将从epoll_wait收到此错误。如果我从其他客户端连接到服务器,则根本无法正常工作。
如何解决此问题,以便可以使用gdb找出从何处获取分段错误错误
提前致谢..
epoll_wait error
: Interrupted system call
最佳答案
您需要修复程序才能正确处理EINTR。 EINTR(“系统调用中断”)不是致命错误;它只是意味着“请再次重试该系统调用”。因此,调用epoll_wait()的代码应该检测到它,然后以静默方式重试该调用。像这样:
int rv;
do {
rv = epoll_wait(epfd, events, maxevents, timeout);
} while (rv == -1 && errno == EINTR);
或者,如果您有固定的超时时间,则需要在每次调用时重新计算它:
int rv;
rv = epoll_wait(epfd, events, maxevents, timeout);
while (rv == -1 && errno == EINTR) {
...TODO: recalculate timeout here...
rv = epoll_wait(epfd, events, maxevents, timeout);
}
如果您对此一无所知,则在调用其他系统调用时可能会遇到相同的错误。特别是read()和write(),还有许多其他调用-检查手册页以查找所使用的调用,并查看它们是否将EINTR列为可能的错误。
阻止EINTR发生通常是不实际的-如果您使用任何使用信号的库,或者您自己使用信号,则可以获取EINTR。上次查看时,Linux线程库使用了信号。