Linux timing function example

Linux timing function
1, alarm function signal function realizes second-level timing
alarm, also known as alarm function, set a timer, when the time is up, execute the signal function

Header file
#include<unistd.h>
Function prototype
unsigned int alarm(unsigned int seconds);
void ( signal(int signum,void( handler)(int)))(int);
split
typedef void (*sig_t) ( int);
sig_t signal(int sig, sig_t func);
2,

#include <unistd.h>
#include <stdio.h>
#include <signal.h>

unsigned int averag_filter(unsigned int input);

void sigalrm_fn(int sig)    
{
    
      
	int tmp;
	tmp = averag_filter(10);
    printf("timer run%d\n",tmp);  
	
    alarm(1);  
}  


int main()
{
    
    
	signal(SIGALRM, sigalrm_fn);
	alarm(1);
	while(1);
	// printf("main run\n");  
	//pause();
}

unsigned int averag_filter(unsigned int input)
{
    
    
    const char cnt = 5;//取多少次数据的平均值 数值越大,取的数据越多,延迟越大
    static unsigned int serial = 0,last_out = 0;
    unsigned int output = 0;
    static unsigned long cal_tmp = 1;
    
    serial++;//累加输入次数
    if(serial == cnt)//取到cnt次数据计算结果
    {
    
    
        serial = 0;            //计数清零
        cal_tmp += input;
        output = cal_tmp / cnt;//计算平均值
        last_out = output;     //更新记录输出值
        cal_tmp = 0;           //总和清零
    }
    else
    {
    
    
        cal_tmp += input; //累加每次输入
        output = last_out;//没加到cnt次,输出上次计算的结果
    }
    return  output;//输出结果
}

2. Setitimer function

当设置时间到以后自动跳转到信号函数执行

函数原型
int setitimer(int which, const struct itimerval *new_value,
struct itimerval *old_value);

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
 
 void timer_fun()
 {
    
    
     static count = 0;
     printf("timer run %d\n", count++);
 }
 

 int main(int argc, char **argv)
 {
    
    
 	//初始化信号函数
    struct sigaction act;
        
     act.sa_handler = timer_fun; //设置处理信号的函数
     act.sa_flags  = 0;
     sigemptyset(&act.sa_mask);
     sigaction(SIGPROF, &act, NULL);//时间到发送SIGROF信号
     //初始化定时时间
     struct itimerval val;
       
    val.it_value.tv_sec = 1; //1秒后启用定时器
     val.it_value.tv_usec = 0;
     val.it_interval = val.it_value; //定时器间隔为1s
     setitimer(ITIMER_PROF, &val, NULL);

     while(1);
     return 0;
 }


Guess you like

Origin blog.csdn.net/u010835747/article/details/105115544