我有以下问题无法解决问题。 我有以下方法(在嵌入式平台中使用)使用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。 有没有人知道为什么会这样?
答案 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);
}