在C语言中如何将timeval结构体重置为NULL实现select无限等待?
在select中实现无限等待的正确方式
要让select无限等待,你根本不需要对timeval结构体做强制转换,直接给select的最后一个参数传NULL指针就行——这正是select设计中用来表示无限等待的标准用法。
为什么你的强制转换没用?
你之前尝试强制转换结构体为指针的思路是错的:timeval是一个结构体变量,哪怕你把它强制转成struct timeval*,得到的也是这个变量的内存地址,不是真正的空指针。select只会读取这个地址指向的超时值,不会当成无限等待处理。
正确实现方式
1. 直接无限等待
如果场景固定需要无限等待,调用select时直接传NULL:
// 无限等待,直到读文件描述符集合中有事件触发 select(fd_max, &readfds, NULL, NULL, NULL);
2. 动态切换超时/无限等待
如果需要根据场景在「有限超时」和「无限等待」之间切换,你可以用一个指针变量来控制:
struct timeval tv; struct timeval *timeout = NULL; // 需要有限超时的场景 if (!need_infinite) { tv.tv_sec = 10; // 设置10秒超时 tv.tv_usec = 0; timeout = &tv; // 让指针指向超时结构体 } // 调用select,自动根据timeout的值选择等待模式 select(fd_max, &readfds, NULL, NULL, timeout);
这样当need_infinite为真时,timeout是NULL,select就会无限等待;否则就使用你设置的超时时间。
内容的提问来源于stack exchange,提问作者amsk
相关产品推荐
相关产品推荐

