You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 23:33:12