GNU/Linux 编程中的定时器

GNU/Linux 编程中的定时器

在Linux C/C++编程中GNU C库提供了多种定时器实现。主要有4种:

1、alarm方式:
    sigaction/signal, 和alarm等函数实现;

2、setitimer方式:
    sigaction/signal, setitimer/setitimer等函数实现;

3、timer_create方式:
    timer_create、timer_settime等函数实现;

4、timerfd_create方式:
    timerfd_settime、timerfd_settime等函数实现;


(1)和(2)可以归为一种,都是使用SIGALRM信号实现定时器的到期
通知。而(4)是通过文件描述符实现的,你可以使用select(2),
poll(2)和epoll(7)来监测由timerfd_create返回的文件描述符,以获
知定时器到期。

文章最后的C代码使用方法(3)。在我的fedora 11中GNU C库会启动
一个线程来操作这两个定时器,并且该线程在两个定时器删除之
前始终存在。

方法(3)和(4)都可以在同一个进程中同时使用多个定时器,
不同定时器之间互不干扰。

编译:
    gcc -g -W -Wall -Wextra -std=gnu99 -o mytest main.c -lrt
执行:
    ./mytest

参考文献:
    timer_create(2), timerfd_create(2), setitimer(2),
    signal(2), sigaction(2), alarm(2), time(7)


下面只是一个简陋的事例代码,有许多不适当的地方。
=====================================================================

main.c:


// 2010年 05月 19日 星期三 08:42:14 CST
// author: 李小丹(Li Shao Dan) 字 殊恒
// K.I.S.S
// S.P.O.T
/*
* Copyright © 2010,2011 李小丹(Li Shao Dan)
*/


#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>

#include <unistd.h>


/*void sig_handler(int s)
{
    psignal(s, "Hello,world");
}*/

void timer_thread(union sigval v)
{
    printf("hello,world! %d/n", v.sival_int);
}

int main()
{
    /*struct sigaction sa;
    memset(&sa, 0, sizeof(sa));
    sa.sa_handler = sig_handler;
    sa.sa_flags = 0;
    sigemptyset(&sa.sa_mask);
    if(sigaction(SIGUSR1, &sa, 0) < 0) {
        perror("sigaction");
        exit(1);
    }
    if(sigaction(SIGUSR2, &sa, 0) < 0) {
        perror("sigaction");
        exit(1);
    }*/

    timer_t t1, t2;
    struct sigevent se;
    memset(&se, 0, sizeof(struct sigevent));

    se.sigev_value.sival_int = 999;
    //se.sigev_signo = SIGUSR1;
    //se.sigev_notify = SIGEV_SIGNAL;
    se.sigev_notify = SIGEV_THREAD;
    se.sigev_notify_function = timer_thread;

    if(timer_create(CLOCK_REALTIME, &se, &t1) < 0) {
        perror("timer_create");
        exit(1);
    }

    se.sigev_value.sival_int = 777;
    //se.sigev_signo = SIGUSR2;
    if(timer_create(CLOCK_REALTIME, &se, &t2) < 0) {
        perror("timer_create");
        exit(1);
    }

    struct itimerspec it;
    it.it_interval.tv_sec = 3;
    it.it_interval.tv_nsec = 0;
    it.it_value.tv_sec = 0;
    it.it_value.tv_nsec = 20000;
    if(timer_settime(t1, 0, &it, 0) < 0) {
        perror("timer_settime");
        exit(1);
    }

    it.it_interval.tv_sec = 5;
    it.it_interval.tv_nsec = 0;
    it.it_value.tv_sec = 0;
    it.it_value.tv_nsec = 50000;
    if(timer_settime(t2, 0, &it, 0) < 0) {
        perror("timer_settime");
        exit(1);
    }

    pause();

    return 0;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值