程序在select()内中止。什么时候可以发生?

时间:2011-12-16 10:19:23

标签: select sigabrt abort

我在C程序中看到这个问题后连接到一个 服务器调用select(),超时为15秒,以检查是否有一些数据 从服务器出现。虽然它正常工作,但它因崩溃而崩溃 有时候,select()中的信号6(SIGABRT)。谁能告诉我什么时候可以选择() 打中止?

(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 :(得分:0)

我遇到SIGABRT的几种情况:

  1. 断言失败(内部函数调用的参数无效,可能是由于内存损坏错误)。

  2. 尝试读取或写入已关闭的端口(通常它应该抛出I / O错误)。

  3. 通过非原始串口进行二进制数据传输,被中断字符中断。