菜鸟笔记
提升您的技术认知

【c程序】timer-ag真人游戏

linux下timer_t定时器的使用,总共有3个函数。

timer_create()  

timer_settime()  

timer_gettime()

头文件: #include #include

函数声明: int
timer_create(clockid_t clockid, struct sigevent * sevp,  timer_t * timerid);

功能:创建一个posix标准的进程定时器

参数:      

@clockid 可选系统系统的宏,比如 clock_realtime      

@sevp 环境值,结构体struct sigevent变量的地址      

@timerid 定时器标识符,结构体timer_t变量的地址      

link with -lrt.

返回值: 0 - 成功;-1 - 失败,errno被设置。

头文件: #include

函数声明: int
timer_settime(timer_t timerid, int flags, const struct itimerspec * new_value,                     

struct itimerspec * old_value);

int
timer_gettime(timer_t timerid, struct itimerspec * curr_value);

功能:设置或者获得定时器时间值

参数:      

@timerid 定时器标识      

@flags 0标识相对时间,1标识绝对时间      

@new_value 定时器的新初始值和间隔,如下面的it      

@old_value 取值通常为0或null,若不为null,则返回定时器前一个值      

link with -lrt.

举例1:采用新线程派驻的通知方式

#include  
#include  
#include  
#include  
#include  
#include  
void timer_thread(union sigval v) 
{ 
    printf("timer_thread function! %d\n", v.sival_int); 
} 
int main() 
{ 
    timer_t timerid; 
    struct sigevent evp; 
    memset(&evp, 0, sizeof(struct sigevent));       //清零初始化 
    evp.sigev_value.sival_int = 111;                //也是标识定时器的,回调函数可以获得 
    evp.sigev_notify = sigev_thread;                //线程通知的方式,派驻新线程 
    evp.sigev_notify_function = timer_thread;       //线程函数地址 
    if (timer_create(clock_realtime, &evp, &timerid) == -1) 
    {   
        perror("fail to timer_create"); 
        exit(-1); 
    }   
    /* 第一次间隔it.it_value这么长,以后每次都是it.it_interval这么长,就是说it.it_value变0的时候会>装载it.it_interval的值 */
    struct itimerspec it; 
    it.it_interval.tv_sec = 1;  // 回调函数执行频率为1s运行1次
    it.it_interval.tv_nsec = 0; 
    it.it_value.tv_sec = 3;     // 倒计时3秒开始调用回调函数
    it.it_value.tv_nsec = 0; 
    if (timer_settime(timerid, 0, &it, null) == -1) 
    {   
        perror("fail to timer_settime"); 
        exit(-1); 
    }   
    //pause();
    while (1);
    return 0; 
} 
/*
 * int timer_gettime(timer_t timerid, struct itimerspec *curr_value);
 * 获取timerid指定的定时器的值,填入curr_value
 */ 

举例2:通知方式为信号的处理方式

#include  
#include  
#include  
#include  
#include  
#include  
#define clockid clock_realtime 
void sig_handler(int signo) 
{ 
    printf("timer_signal function! %d\n", signo); 
} 
int main() 
{ 
    // xxx int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 
    // signum--指定的信号编号,可以指定sigkill和sigstop以外的所有信号编号 
    // act结构体--设置信号编号为signum的处理方式 
    // oldact结构体--保存上次的处理方式 
    // 
    // struct sigaction   
    // { 
    // void (*sa_handler)(int);         //信号响应函数地址 
    // void (*sa_sigaction)(int, siginfo_t *, void *);   //但sa_flags为sa——siginfo时才使用 
    // sigset_t sa_mask;         //说明一个信号集在调用捕捉函数之前,会加入进程的屏蔽中,当捕捉函数返回时,还原 
    // int sa_flags; 
    // void (*sa_restorer)(void);   //未用 
    // }; 
    // 
    timer_t timerid; 
    struct sigevent evp; 
    struct sigaction act; 
    memset(&act, 0, sizeof(act)); 
    act.sa_handler = sig_handler; 
    act.sa_flags = 0; 
    // xxx int sigaddset(sigset_t *set, int signum);  //将signum指定的信号加入set信号集
    // xxx int sigemptyset(sigset_t *set);          //初始化信号集 
    sigemptyset(&act.sa_mask); 
    if (sigaction(sigusr1, &act, null) == -1) 
    { 
        perror("fail to sigaction"); 
        exit(-1); 
    } 
    memset(&evp, 0, sizeof(struct sigevent)); 
    evp.sigev_signo = sigusr1; 
    evp.sigev_notify = sigev_signal; 
    if (timer_create(clock_realtime, &evp, &timerid) == -1) 
    { 
        perror("fail to timer_create"); 
        exit(-1); 
    } 
    struct itimerspec it; 
    it.it_interval.tv_sec = 2; 
    it.it_interval.tv_nsec = 0; 
    it.it_value.tv_sec = 1; 
    it.it_value.tv_nsec = 0; 
    if (timer_settime(timerid, 0, &it, 0) == -1) 
    { 
        perror("fail to timer_settime"); 
        exit(-1); 
    } 
    pause(); 
    return 0; 
} 
网站地图