linux 获取时间计算延时,定时器 setitimer 和 gettimeofday 获取当前时间【Linux微秒级】...

文章目录

setitimer延时、定时

参数

返回值

工作机制

例子

SIGALRM信号

获取系统当前时间

参数

返回值

例子

setitimer延时、定时

#include int setitimer(

int which,

const struct itimerval * new_value,

struct itimerval * old_value

);

struct itimerval{

struct timeval it_interval; //周期执行时间

struct timeval it_value; //延迟执行时间

};

struct timeval{

time_t tv_sec; //秒

suseconds_t tv_usec; //微秒

};

参数

which :

ITIMER_REAL:以系统真实的时间来计算,送出SIGALRM信号。  ITMER_VIRTUAL:以该进程在用户态下花费的时间来计算,送出SIGVTALRM 信号。

ITMER_PROF:以该进程在用户态下和内核态下所费的时间来计算,送出SIGPROF信号。

old_value:

一般置为NULL,用来存储上一次setitimer调用时设置的new_value。

返回值

调用成功返回0,否则返回-1。

工作机制

it_value倒计时,为0时触发信号,it_value重置为it_interval,继续倒计时,周期执行。

周期执行时,it_value不为0,设置it_interval;

延迟执行时,设置it_value,it_interval为0。

例子

#include

#include

#include

void signalHandler(int signo){

switch (signo){

case SIGALRM:

printf("Caught the SIGALRM signal!\n");

break;

}

}

//延时1微秒便触发一次SIGALRM信号,以后每隔200毫秒触发一次SIGALRM信号。

int main(int argc, char *argv[]){

//安装SIGALRM信号

signal(SIGALRM, signalHandler);

struct itimerval new_value, old_value;

new_value.it_value.tv_sec = 0;

new_value.it_value.tv_usec = 1;

new_value.it_interval.tv_sec = 0;

new_value.it_interval.tv_usec = 200000;

setitimer(ITIMER_REAL, &new_value, &old_value); f

or(;;);

return 0;

}

SIGALRM信号

#include

在POSIX兼容平台上,SIGALRM是在定时器终止时发送给进程的信号。

SIG是信号名的通用前缀。

ALRM是alarm的缩写,即定时器。

要使用定时器,首先要安装SIGALRM信号。如果不安装,进程收到信号后,缺省的动作就是终止当前进程。

获取系统当前时间

#include #include int gettimeofday(

struct timeval * tv,

struct timezone * tz

);

struct timeval{

long tv_sec; //秒

long tv_usec; //微秒

};

struct timezone{

int tz_minuteswest; //和格林威治时间差了多少分钟

int tz_dsttime; //日光节约时间的状态

};

参数

tv:返回当前时间

tz:当地时区信息

返回值

调用成功返回0,否则返回-1。

例子

#include

#include

#include

#include

#include

int main(){

struct timeval tv;

gettimeofday(&tv,NULL);

printf("second:%ld\n",tv.tv_sec);//秒

printf("millisecond:%ld\n",tv.tv_sec*1000 + tv.tv_usec/1000);//毫秒

printf("microsecond:%ld\n",tv.tv_sec*1000000 + tv.tv_usec); //微秒

sleep(3);

std::cout << "3s later:" << std::endl;

gettimeofday(&tv,NULL);printf("second:%ld\n",tv.tv_sec);//秒

printf("millisecond:%ld\n",tv.tv_sec*1000 + tv.tv_usec/1000);//毫秒

printf("microsecond:%ld\n",tv.tv_sec*1000000 + tv.tv_usec); //微秒

return0;

}

//获取当前时间,单位毫秒

int getCurrentTime(){

struct timeval tv;

gettimeofday(&tv,NULL);

return tv.tv_sec*1000 + tv.tv_usec/1000;

}

参考资料:

https://blog.csdn.net/lixianlin/article/details/25604779

https://blog.csdn.net/zaishaoyi/article/details/20239997

https://baike.baidu.com/item/SIGALRM/22777025

https://blog.csdn.net/xiewenhao12/article/details/78707101

http://c.biancheng.net/cpp/html/142.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
setitimer函数是Linux中实现高精度定时器的系统调用。它用于设置一个定时器,在指定的时间间隔内周期性地触发一个定时信号。函数原型如下: ```c int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value); ``` 其中,which参数指定了定时器的类型。常用的取值有: - ITIMER_REAL:使用系统的真实时间来计算定时器间隔,与系统的墙钟相关。 - ITIMER_VIRTUAL:使用进程的虚拟时间来计算定时器间隔,即进程在用户态运行的时间。 - ITIMER_PROF:使用进程在用户态和内核态运行的总时间来计算定时器间隔。 new_value参数是一个itimerval结构体指针,用于指定定时器的间隔和初始启动时间。该结构体定义如下: ```c struct itimerval { struct timeval it_interval; // 定时器的间隔 struct timeval it_value; // 定时器的初始启动时间 }; ``` 其中,timeval结构体定义如下: ```c struct timeval { time_t tv_sec; // 秒数 suseconds_t tv_usec; // 微秒数 }; ``` old_value参数是一个itimerval结构体指针,用于保存之前的定时器设置。 在使用setitimer函数之前,需要通过signal函数注册一个信号处理函数,用于处理定时器触发的信号。一般常用的信号是SIGALRM。 使用setitimer函数可以实现一些需要高精度定时的场景,比如周期性地刷新屏幕、定时采集传感器数据等。定时器的间隔可通过设置it_interval参数来调整,定时器的初始启动时间可通过设置it_value参数来设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值