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;
}
GNU/Linux 编程中的定时器
最新推荐文章于 2024-07-17 15:30:42 发布