更好的sleep nanosleep


nanosleep 系统调用是一个相比标准 UNIX 的 sleep 调用具有更高高精度的版本。和普通的 sleep 调用计算整秒数不同,nanosleep 接受一个指向一个 struct timespec 对象的指针作为参数,它可以表示毫微秒(nanosecond,十亿分之一秒)的时间。然而,了解 Linux 内核的工作细节后可知,nanosleep 所提供的真正精确度是10毫秒——比 sleep 提供的要精确。这个附加的精确度非常有用,比如说,可以根为反复进行的任务设置更短的间隔。

struct timespec 由两部分构成:tv_sec 表示整秒数部分;tv_nsec 则表示毫微秒(译者注:原文为 milliseconds,疑为笔误)。tv_nesc 的值必须小于109。

nanosleep 相比 sleep 具有另一个优点。与 sleep 相同,nanosleep 调用可以被信号中断,这是errno 将被设置为 EINTR 而调用将返回 -1。但是,nanosleep 的第二个参数,另一个指向 struct timespec 对象的指针,如果不为 NULL 则在这种情况下它将被写入剩余的时间(这就是所请求的睡眠时间和实际睡眠时间的差)。这使重新开始睡眠变的很容易。

代码 8.8 的函数提供了 sleep 函数的另一种实现方法。和常见的系统调用不同,这个函数使用了一个浮点数描述睡眠秒数,而被信号中断后重启动的睡眠秒数。

int better_sleep (unsigned long sleep_time)
{
  struct timespec tv;  
  tv.tv_sec = (time_t) sleep_time /1000;  
  tv.tv_nsec =  sleep_time * 1000000 ;

  while (1)
  {    
    int rval = nanosleep (&tv, &tv);
    if (rval == 0)      
      return 0;
    else if (errno == EINTR)      
      continue;
    else      
      return rval;
  }
  return 0;
}





评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值