select() 的 timeout 陷阱

今天说说 select() 接口的最后一个参数 timeout 陷阱。

说这个是陷阱,其实对 API 作者有点不公平,

在 POSIX 2001.12 的说明上已经明确的标注,见下图。 

(ii)   select() may update the timeout argument to indicate how much time was left.  pselect() does not change this argument.

select() 这个接口在调用完以后可能会更新 timeout 参数,

用于标识 timeout 剩余的时间,

例如:上层用户希望进行 3 秒的 timeout,

而接口内部在 1 秒的时间操作完成了(可能成功也可能失败)返回了,

这个时候 timeout 的值会更新为 2 秒。

对于有点偏执型的 programmer,例如我,

潜意识会对循环内赋值有抵触情绪,

在调用 select() 的 timeout 会倾向于在循环外部进行赋值,以降低不必要的 CPU 消耗,

这个原本是很好的潜意识设定,偏偏误进了泥淖,见下图。

timeout.tv_sec=10;
timeout.tv_usec=0;

while(condition()) {
  if (select(fd, rdset,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值