博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux信号实践(5) --时间与定时器
阅读量:5063 次
发布时间:2019-06-12

本文共 2888 字,大约阅读时间需要 9 分钟。

三种不同精度的睡眠

1.sleep

#include 
unsigned int sleep(unsigned int seconds);

RETURN VALUE

   Zero if the requested time has elapsed, or the number of seconds left to  sleep,  

if  the call was interrupted by a signal handler.

//示例int sleepTime = 5;do{    sleepTime = sleep(sleepTime);}while (sleepTime > 0);

2.usleep(以微秒为单位)

int usleep(useconds_t usec);

The  type useconds_t is an unsigned integer type capable of holding integers in the range [0,1000000]. 

Programs will be more portable if they never mention this type  explicitly.

3.nanosleep(以纳秒为单位)

#include 
int nanosleep(const struct timespec *req, struct timespec *rem);

req指定睡眠的时间, rem返回剩余的睡眠时间

struct timespec{    time_t tv_sec;        /* seconds: 秒 */    long   tv_nsec;       /* nanoseconds: 纳秒 */};

三种时间结构

time_t
struct timeval {	long    tv_sec;         /* seconds */	long    tv_usec;        /* microseconds 微秒*/};
struct timespec {	time_t tv_sec;        /* seconds */	long   tv_nsec;       /* nanoseconds */};

setitimer

#include 
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));

setitimer()比alarm功能强大,支持3种类型的定时器

参数

  第一个参数which指定定时器类型

  第二个参数是请求的时间

  第三个参数是定时器原来所关联的值

struct itimerval{    struct timeval it_interval; /* next value : 产生信号的间隔时间*/    struct timeval it_value;    /* current value : 第一次产生信号的时间*/};struct timeval{    time_t      tv_sec;         /* seconds: 秒 */    suseconds_t tv_usec;        /* microseconds: 微秒 */};

which值

  ITIMER_REAL: 经过指定的时间后,内核将发送SIGALRM信号给本进程 (用的较多)

  ITIMER_VIRTUAL : 程序在用户空间执行指定的时间后,内核将发送SIGVTALRM信号给本进程 

  ITIMER_PROF : 进程在内核空间中执行时,时间计数会减少,通常与ITIMER_VIRTUAL共用,代表进程在用户空间与内核空间中运行指定时间后,内核将发送SIGPROF信号给本进程。

/**示例1:1.在启动进程的5秒之后产生信号2.然后每隔1秒产生一次信号**/int main(){    if (signal(SIGALRM, signalAction) == SIG_ERR)        err_exit("signal error");    struct itimerval it;    struct timeval it_interval = {1, 0};    struct timeval it_value = {5, 0};    it.it_interval = it_interval;    it.it_value = it_value;    if (setitimer(ITIMER_REAL, &it, NULL) == -1)        err_exit("setitimer error");    while (true)        pause();}
/**示例2:获取itimerval 结构体**/int main(){    struct itimerval it;    struct timeval it_interval = {1, 0};    struct timeval it_value = {5, 0};    it.it_interval = it_interval;    it.it_value = it_value;    if (setitimer(ITIMER_REAL, &it, NULL) == -1)        err_exit("setitimer error");    for (int i = 0; i < 100000; ++i)        ;    struct itimerval oldIt;//    if (setitimer(ITIMER_REAL, &it, &oldIt) == -1)//        err_exit("setitimer error");    // 在不重新设置时钟的情况下获取剩余时间    if (getitimer(ITIMER_REAL, &oldIt) == -1)        err_exit("getitimer error");    cout << oldIt.it_interval.tv_sec << ' ' << oldIt.it_interval.tv_usec         << ' ' << oldIt.it_value.tv_sec << ' ' << oldIt.it_value.tv_usec << endl;}

附:秒-微秒-纳秒的转换

  S(秒)、ms(毫秒)、μs(微秒)、ns(纳秒),其中:1s=1000ms,1 ms=1000μs,1μs=1000ns

转载于:https://www.cnblogs.com/itrena/p/5926967.html

你可能感兴趣的文章
jquery datagrid 后台获取datatable处理成正确的json字符串
查看>>
作业一
查看>>
AJAX
查看>>
ActiveMQ与spring整合
查看>>
web服务器
查看>>
Mysql慢日志
查看>>
延迟环境变量扩展(bat)
查看>>
Git的使用--打tag
查看>>
F# 编程 借助 F# 构建 MVVM 应用程序
查看>>
ACFUN切换代码自用。。。
查看>>
网卡流量检测.py
查看>>
【转】Android的权限permission
查看>>
ajax
查看>>
poj1981 Circle and Points 单位圆覆盖问题
查看>>
POP的Stroke动画
查看>>
线程同步机制初识 【转载】
查看>>
Oracle 游标使用全解
查看>>
Spring mvc annotation and xml example
查看>>
关于报错The specified child already has a parent的解决办法
查看>>
SQL语句在查询分析器中可以执行,代码中不能执行
查看>>