Я вижу эту проблему в программе на C, которая после подключения к серверу вызывает select() с таймаутом в 15 секунд, чтобы проверить, есть ли какие-то данные с сервера. Хотя он работает нормально, но он падает, потому что сигнала 6 (SIGABRT) в select() иногда. Может ли кто-нибудь сказать, когда можно выбрать() hit abort?Программа прерывается внутри select(). Когда это может произойти?
(gdb) bt
#0 0x29309527 in select() from /usr/lib32/libc.so.6
#1 0x2921530c in select() from /usr/lib32/libpthread.so.2
#2 0x284ac0c0 in wait_until_writable (fd=48, timeout=15)
Пример кода для функции wait_until_writable()
:
int wait_until_writable(int fd, int timeout)
{
int n, error;
socklen_t len;
struct timeval tv;
fd_set wfd;
tv.tv_sec = timeout;
tv.tv_usec = 0;
error = 0;
FD_ZERO(&wfd);
FD_SET(fd,&wfd);
// XXX An improvement would be to loop while errno=EINTR
n = select(fd+1, NULL, &wfd, NULL, &tv);
if (n > 0 && FD_ISSET((int)fd, &wfd)) {
len = sizeof(error);
if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
return -1;
}
if (error) {
return -1;
}
return 0;
}
return -1;
}
Вам понадобится предоставить примерный код и дополнительную информацию, чтобы получить ответ на этот вопрос. Выбираете() свою собственную функцию? –
Нет, это системный вызов. –