Exemple de fonction de synchronisation Linux

Fonction de synchronisation Linux
1, la fonction de signal de fonction d'alarme réalise une
alarme de synchronisation de deuxième niveau , également appelée fonction d'alarme, définit une minuterie, lorsque le temps est écoulé, exécute la fonction de signal

Fichier d'en-tête
#include <unistd.h>
Fonction prototype
unsigned int alarm (unsigned int secondes);
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. Fonction Setitimer

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

函数 原型
int setitimer (int qui, 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;
 }


Je suppose que tu aimes

Origine blog.csdn.net/u010835747/article/details/105115544
conseillé
Classement