Linux定时器的使用

帮助| 留言交流| 登录

| 首 页 | 阅览室 | 馆友 | 我的图书馆

来自：womking > Linux Programming

配色： |  |  |  |  |  |  | 字号：大中小

Linux定时器的使用

2009-04-15 | 阅：11783 转：18
| 分享

- 腾讯空间
- 人人网
- 开心网
- 新浪微博
- 腾讯微博
- 搜狐空间
- 推荐给朋友
- 举报

我 们所使用的Linux下的定时器有两种，以下分别介绍： 1、alarm 如果不要求很精确的话，用alarm()和signal()就够了 unsigned int alarm(unsigned int seconds) 函数说明: alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程。如果参数

我们所使用的Linux下的定时器有两种，以下分别介绍：
1、alarm
如果不要求很精确的话，用alarm()和signal()就够了
unsigned int alarm(unsigned int seconds)
函数说明: alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程。如果参数seconds为0，则之前设置的闹钟会被取消，并将剩下的时间返回。
返回值: 返回之前闹钟的剩余秒数，如果之前未设闹钟则返回0。
alarm()执行后，进程将继续执行，在后期(alarm以后)的执行过程中将会在seconds秒后收到信号SIGALRM并执行其处理函数。
#include
void sigalrm_fn(int sig)
{
printf("alarm!\n");
alarm(2);
return;
}
int main(void)
{
signal(SIGALRM, sigalrm_fn);
alarm(1);
while(1) pause();
}
2、setitimer()
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));
setitimer()比alarm功能强大，支持3种类型的定时器：
ITIMER_REAL : 以系统真实的时间来计算，它送出SIGALRM信号。
ITIMER_VIRTUAL : -以该进程在用户态下花费的时间来计算，它送出SIGVTALRM信号。
ITIMER_PROF : 以该进程在用户态下和内核态下所费的时间来计算，它送出SIGPROF信号。
setitimer()第一个参数which指定定时器类型（上面三种之一）；第二个参数是结构itimerval的一个实例；第三个参数可不做处理。
setitimer()调用成功返回0，否则返回-1。
下面是关于setitimer调用的一个简单示范

在该例子中，每隔一秒发出一个SIGALRM，每隔0.5秒发出一个SIGVTALRM信号:
#include
int sec;
void sigroutine(int signo){
switch (signo){
case SIGALRM:
printf("Catch a signal -- SIGALRM \n");
signal(SIGALRM, sigroutine);
break;
case SIGVTALRM:
printf("Catch a signal -- SIGVTALRM \n");
signal(SIGVTALRM, sigroutine);
break;
}
return;
}
int main()
{
struct itimerval value, ovalue, value2; //(1)
sec = 5;
printf("process id is %d\n", getpid());
signal(SIGALRM, sigroutine);
signal(SIGVTALRM, sigroutine);
value.it_value.tv_sec = 1;
value.it_value.tv_usec = 0;
value.it_interval.tv_sec = 1;
value.it_interval.tv_usec = 0;
setitimer(ITIMER_REAL, &value, &ovalue); //(2)
value2.it_value.tv_sec = 0;
value2.it_value.tv_usec = 500000;
value2.it_interval.tv_sec = 0;
value2.it_interval.tv_usec = 500000;
setitimer(ITIMER_VIRTUAL, &value2, &ovalue);
for(;;)
;
}
(1) struct itimerval
struct itimerval {
struct timeval it_interval; /* timer interval */
struct timeval it_value; /* current value */
};
itimerval: i --> interval
val --> value
itimerval结构中的it_value是减少的时间,当这个值为0的时候就发出相应的信号了. 然后再将it_value设置为it_interval值.
(2) setitimer()
setitimer()为其所在进程设置一个定时器，如果itimerval.it_interval不为0(it_interval的两个域都不为0)，则该定时器将持续有效(每隔一段时间就会发送一个信号)
注 意：Linux信号机制基本上是从Unix系统中继承过来的。早期Unix系统中的信号机制比较简单和原始，后来在实践中暴露出一些问题，因此，把那些建 立在早期机制上的信号叫做"不可靠信号"，信号值小于SIGRTMIN(SIGRTMIN=32，SIGRTMAX=63)的信号都是不可靠信号。这就 是"不可靠信号"的来源。它的主要问题是：进程每次处理信号后，就将对信号的响应设置为默认动作。在某些情况下，将导致对信号的错误处理；因此，用户如果 不希望这样的操作，那么就要在信号处理函数结尾再一次调用signal()，重新安装该信号。

上一篇：Linux 中的计时方法 下一篇：jiffies溢出与时间先后比较

献花(0) +1

分享到：

- 推荐给朋友
- 举报

(本文系womking首藏 源文网址)

类似文章

- linux精通定时器
- (原创) 如何每间格一段时间就执行functi...
- setitimer函数使用笔记 - Jiwu Bu - C++...
- linux c语言定时器_ljd_1986513的空间_百....
- 多线程中定时器的使用
- 如何在Linux下实现定时器_zkheartboy's ...
- VC中定时器的使用_VC技术文章_VC_软件编...
- 使用BusyBox制作linux根文件系统
- stm32 定时器中断实验

更多

您可能会喜欢
Linux 筆記
Linux 系統管理
Linux内存管理 下
从0开始复习linux
Linux以及各大发行版介绍|-Linux起点
无觅
发表评论：
您好，请 登录 或者 注册 后再进行评论

使用合作网站登录： |  | 新浪微博 |  | QQ |  | 人人

womking
馆藏：119
关注我：13

- 无线网络安全WEP/WPA/WPA2
- 802.11基本传输方式-信道竞争机...
- 802.11e Access Mode
- WLAN隐藏节点问题--RTS/CTS机制
- 理解Windows中的路由表和默认网...
- Linux 内核软中断执行分析|Linu...
- vim lookupfile plugin
- jeffy-vim 很强的一个vim插件及...
- WIDS(无线入侵检测)
- Vmware Workstation增加硬盘空间
- VmWare虚拟机增加硬盘容量
- GNU-ld链接脚本浅析

更多>>
-
热门文章

- 高层住宅几层最好
- [情情爱爱 ] 一人一半，是伴；...
- 视频 走遍中国11
- 退休工资计算方法
- 男淫女淫们，你是否觉得心里一震
- 得到大家赞赏的婚礼发言稿
- 史上最全的电脑常识大集合
- 李强 成功人际关系—让你成为顶...
- 衣服翻新技巧
- 七个爱情故事给你七种震撼
- 三只老鼠偷油引发的管理争吵_余...
- 最给力的5条人生定律

更多>>

关闭

关闭
1、请先 注册 拥有自己的360doc图书馆；
2、点击文章左上角的 转藏到我的图书馆 ，将文章保存到您自己的个人图书馆中，然后可以拷贝自己文章的内容！