2011-12-16 4 views
1

Я вижу эту проблему в программе на 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; 
} 
+0

Вам понадобится предоставить примерный код и дополнительную информацию, чтобы получить ответ на этот вопрос. Выбираете() свою собственную функцию? –

+0

Нет, это системный вызов. –

ответ

0

несколько случаев, когда я столкнулся с SIGABRT:

  1. отказа Утверждение (недействительные аргументы для вызова внутренней функции, возможно, из-за к ошибке повреждения памяти).

  2. Попытка чтения или записи в закрытый порт (как правило, это должно привести к ошибке ввода-вывода).

  3. Двоичная передача данных через несырьевой последовательный порт, который прерывается символом прерывания.

 Смежные вопросы

  • Нет связанных вопросов^_^