Linux用户态定时器用法以及犯错总结【转】

简介:

转自:http://blog.csdn.net/csdn_logo/article/details/48525703

采样的时候要用到定时器,定时的进行采样。这时候,就会用到setitimer函数了。

1. 要使用setitimer函数,要包含头文件:#include <sys/time.h>

2. 该函数的原型是:int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);

3. 参数:

(1)int which:定时器分以下三种

ITIMER_REAL:decrements in real time, and deliversSIGALRM upon expiration.

以系统真实的时间来计算,它送出SIGALRM信号。

ITIMER_VIRTUAL:decrements only  when  the  process  is  executing,  anddeliversSIGVTALRM upon expiration.

以该进程在用户态下花费的时间来计算,它送出SIGVTALRM信号。

ITIMER_PROF:decrements  both  when the process executes and when the system is executing on behalf 

of the  process. Coupledwith  ITIMER_VIRTUAL, this timer is usually used to profile the time

 spent by the application in user and  kernel space.  SIGPROF is delivered

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

(2)struct itimerval *new_value,其定义如下:

struct itimerval {  
               struct timeval it_interval; /* 定时器间隔时间 */  
               struct timeval it_value; /* 定时器开始运行延时时间 */  
           };  
struct timeval {  
               long tv_sec; /* 秒 */  
               long tv_usec; /* 微秒 */  
           };  

其中it_value表示设置定时器后间隔多久开始执行定时任务,而it_interval表示两次定时任务之间的时间间隔。

(3)上一次定时器的值,一般置为NULL即可

4. 返回值:成功返回0;失败返回-1,并把错误号写到errno变量中

5. 犯错笔记

5.1

 

[cpp]  view plain  copy print?
  1. ...  
  2. struct itimerval itv;  
  3.   
  4. if (signal(SIGALRM, samplingForComtrade) == SIG_ERR) {  
  5.     DBG("signal samplingForComtrade() bind failed !\n");  
  6.     exit(EXIT_FAILURE);  
  7. }  
  8. itv.it_value.tv_sec = 0;  
  9. itv.it_value.tv_usec = 0;  
  10. itv.it_interval.tv_sec = 0;  
  11. itv.it_interval.tv_usec = 1000;  
  12. if(setitimer(ITIMER_REAL,&itv,NULL) != 0){  
  13.     fprintf(stderr,"setitimer failed,errno = %d\n",errno);  
  14.     exit(EXIT_FAILURE);  
  15. }  
  16. ...  

  如上设置好后samplingForComtrade()函数怎么也不跑起来,查问题查到绝望,最后才发现当你把it_value参数里面的秒和微秒全部设置为0时,定时器是跑不起来的。。。 

settimer工作机制是,先对it_value倒计时,当it_value为零时触发信号,然后重置为it_interval,继续对it_value倒计时,一直这样循环下去。

假如it_value为0是不会触发信号的,所以要能触发信号,it_value得大于0;如果it_interval为零,只会延时,不会定时(也就是说只会触发一次信号)。

5.2

setitimer()函数调用完,定时器就跑一次处理函数,第二次的时候打印出 Alarm clock ,然后程序直接退出。

查到想死才查出原因:原来是由于编译的时候加了编译条件 -std=c99, 会跟定时器冲突,去掉就行了。。。无语!

5.3

使用了定时器后sleep()函数就不好使了,因为sleep函数也是使用的SIGALRM信号。

解决办法是采用其他延时方式,如select等。









本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/7053268.html,如需转载请自行联系原作者


相关文章
|
3月前
|
监控 Linux 应用服务中间件
linux查看日志文件tail -f用法
在 Linux 中,查看和监控日志文件是系统管理员和开发者常用的操作之一。tail 命令就是用来查看文件内容的,它默认显示文件的最后部分。tail -f 是 tail 命令的一个非常有用的选项,用于实时查看和跟踪日志文件的更新,尤其是在监控运行中的服务时非常有用。
470 0
|
8月前
|
Shell Linux
【linux】Shell脚本中basename和dirname的详细用法教程
本文详细介绍了Linux Shell脚本中 `basename`和 `dirname`命令的用法,包括去除路径信息、去除后缀、批量处理文件名和路径等。同时,通过文件备份和日志文件分离的实践应用,展示了这两个命令在实际脚本中的应用场景。希望本文能帮助您更好地理解和应用 `basename`和 `dirname`命令,提高Shell脚本编写的效率和灵活性。
600 32
|
11月前
|
安全 网络协议 Linux
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。通过掌握 ping 命令,读者可以轻松测试网络连通性、诊断网络问题并提升网络管理能力。
917 3
|
12月前
|
Ubuntu Linux
Linux的基础用法
Linux的基础用法
81 6
|
监控 Linux
Linux系统中du命令与df命令的区别与用法
总的来说,`du` 和 `df` 在磁盘管理中互补使用,能够提供全面的磁盘空间使用信息,帮助用户和管理员有效地监控和管理系统资源。
412 3
|
存储 Ubuntu Linux
linux中的find 命令详细用法
本文介绍了如何将 `find` 命令与 `exec` 结合使用,通过具体示例展示了多种应用场景,如显示文件属性、重命名文件、收集文件大小、删除特定文件、执行工具、更改文件所有权和权限、收集 MD5 值等。文章还探讨了 `{} \;` 和 `{} +` 的区别,并演示了如何结合 `grep` 命令进行内容搜索。最后,介绍了如何在一个 `find` 命令中使用多个 `exec` 命令。这为 Linux 用户提供了强大的文件管理和自动化工具。
|
监控 Linux 数据处理
|
JavaScript Linux
【详细讲解】Linux grep命令用法大全 片尾有示例搜索指定目录中指定文件后缀的指定字符
【详细讲解】Linux grep命令用法大全 片尾有示例搜索指定目录中指定文件后缀的指定字符
465 1
|
存储 运维 监控
运维.Linux下执行定时任务(上:Cron简介与用法解析)
运维.Linux下执行定时任务(上:Cron简介与用法解析)
165 0
|
XML Linux API
探索Linux中的dbus-binding-tool:理解其用途与用法
`dbus-binding-tool`是Linux D-Bus工具集的一部分,用于从XML接口描述生成语言绑定代码,简化D-Bus服务在应用程序中的集成。它支持自动代码生成,多种语言(如C、C++、Python),并提供灵活性以适应特定需求。使用步骤包括获取XML描述文件,运行工具生成代码,然后在应用中使用生成的API。注意版本兼容性、错误处理,并参考官方文档和示例以优化使用。该工具助力开发人员高效实现进程间通信和系统服务集成。