Программа прервана внутри select (). Когда это может случиться? - PullRequest
1 голос
/ 16 декабря 2011

Я вижу эту проблему в программе на C, которая после подключения к сервер вызывает select () с тайм-аутом 15 секунд, чтобы проверить, есть ли некоторые данные присутствует с сервера. Хотя работает нормально, но вылетает, потому что сигнала 6 (SIGABRT) в 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;
}

1 Ответ

0 голосов
/ 21 июня 2016

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

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

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

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

...