选择()系统调用挂起(断开网络电缆时不接收信号处理程序)

时间:2016-09-19 13:50:13

标签: sockets embedded-linux system-calls

我有以下问题无法解决问题。 我有以下方法(在嵌入式平台中使用)使用select():

int wait_fd_readable(int fd, long msec)
{
    fd_set rset;
    FD_ZERO(&rset);
    FD_SET(fd, &rset);
    struct timeval tv = { msec / 1000, (msec % 1000) * 1000 };
    struct timeval *timeout = msec < 0 ? 0 : &tv;
    return select(fd + 1, &rset, 0, 0, timeout);
}

一般来说效果非常好,除非我断开网络电缆,其中select似乎挂起并且永远不会按预期返回-1。 有没有人知道为什么会这样?

1 个答案:

答案 0 :(得分:0)

您的问题似乎在struct timeval *timeout = msec < 0 ? 0 : &tv;行:

如果msec为否定,则timeout设置为NULL,您的select来电将无限期等待。

来自man select

  

如果timeout为NULL(无超时),则select()可以无限期地阻塞。

尝试替换为:

int wait_fd_readable(int fd, long msec)
{
    fd_set rset;
    FD_ZERO(&rset);
    FD_SET(fd, &rset);
    if (msec < 0) {msec = 0;}
    struct timeval tv = { msec / 1000, (msec % 1000) * 1000 };
    return select(fd + 1, &rset, 0, 0, &tv);
}