刚入职一搞通讯的公司,我接手的是一段关于基站跟远程控制中心交互的程序。其
中,有一个小功能(定时器),哥们看了觉得很赞,现把代码片段扣出来和猿们交流。
中,有一个小功能(定时器),哥们看了觉得很赞,现把代码片段扣出来和猿们交流。
在理解这段代码的过程中,我仔细翻阅了《APUE》和man手册。详细解说就不讲了,
这2件神器在手,足以把定时器解析的偏僻如理。
/* ************************************************************************
* Filename: 1.c
* Description:
* Version: 1.0
* Created: 2014年11月13日 16时58分35秒
* Revision: none
* Compiler: gcc
* Author: wuxiangege (),
* Company:
* ************************************************************************/
#include <unistd.h>
#include <sys/select.h>
#include <sys/time.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
//用系统API实现定时器功能
while(1)
{
//C99
struct timeval timeout={
.tv_sec = 3,
.tv_usec = 0,
};
//等待内核计时满
select(2, NULL, NULL, NULL, &timeout);
printf("wuxiangege is a linux pragrammer.\n");//3秒钟后打印一次
}
return 0;
}
<span style="white-space:pre"> </span>利用select可以实现比sleep更为精确地定时,其精度取决于操作系统最小时间片。公司代码中定时器的实现原理是这样的:每次注册一个定时器则开启一个线程,每个线程中安置一个select系统调用,用来监视时间是否到来。其实这样做是有缺陷的,那就是随着定时器的增多,线程会数量会相应的增加,导致的结果就是CPU的负荷增加,系统性能下降。