nanosleep() -- 更精确的延迟 -----一个使用用例

[常规] nanosleep() -- 更精确的延迟 

[复制链接]
  

4220

主题

5152

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
30607
电梯直达 跳转到指定楼层
楼主
 
  发表于 2010-8-22 00:08:53 只看该作者 回帖奖励
原型:
#include <time.h>
int  nanosleep( const  struct  timespec  * req ,  struct  timespec  * rem);

说明:
此函数将调用进程挂起,直到 req 里所指的时间结束。req 是 struct timespec 结构体的指针。struct timespec 结构体定义如下:
struct  timespec  {
    time_t  tv_sec;         /* 秒 */
    long    tv_nsec;        /* 纳秒 */
};
如果在调用 nanosleep() 睡眠期间被信号所中断,nanosleep() 就会返回 -1,同时设置 errno 为 EINTR,并且会将剩余的时间写入由 rem 所指向同样时 struct timespec 类型的结构体中,如果 rem 为 NULL,就不会记录剩余时间。当信号处理完毕时,还会继续调用 nanosleep() 直到剩余时间用完为止。

测试程序:
#include <stdio.h>
#include <time.h>
#include <signal.h>
#include <errno.h>

void  sigfunc ( int  sig_no)
{
      int  temp  =  1000;
      while ( temp --  >  0)
     ;
}



int  msleep ( unsigned  long  milisec ,  int  temp)
{
      struct  timespec  req  =  { 0 },  rem  =  { 0 };
      time_t  sec  = ( int)( milisec  /  1000);
      milisec  =  milisec  - ( sec  *  1000);
      req . tv_sec  =  sec;             /*秒*/
      req . tv_nsec  =  milisec  *  1000000L;     /*纳秒*/
      while ( nanosleep ( & req ,  & req==  - 1  &&  errno  ==  EINTR{
          printf ( "测试-%d被信号中断,剩余时间为: %ld秒%ld纳秒 \n " ,  temp ,  req . tv_sec ,  req . tv_nsec);
          continue;
      }
      return ( 1);
}


int  main()
{
      struct  sigaction  sa  =  { 0 };
      sa . sa_handler  =  & sigfunc;
      sigaction ( SIGINT ,  & sa ,  NULL);    //安装信号处理函数

      unsigned  long  a  =  0;
      int  temp  =  1;
      scanf ( "%ld" ,  & a);

      for (;;)  {
          if ( a  ==  5{
              printf ( "testing-%d \n " ,  temp);
              msleep ( a * 1000 ,  temp);   //将 nanosleep() 封装在 msleep() 中
             temp++;
        }
  else
              usleep ( 1000000);
      }
      return ( 1);
}
运行与输出:
$ ./nanosleep 
5
testing-1
testing-2
^C测试-2被信号中断,剩余时间为: 4秒120263116纳秒
^C测试-2被信号中断,剩余时间为: 3秒440359866纳秒
^C测试-2被信号中断,剩余时间为: 2秒320431341纳秒
^C测试-2被信号中断,剩余时间为: 1秒320495448纳秒
testing-3
... ...
上面,^C 表示按下 Ctrl + c 组合键,发出中断函数信号。
 
 from:http://www.groad.net/bbs/thread-2621-1-1.html
 
 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值