GNU/Linux 编程中的定时器


GNU/Linux 编程中的定时器
2011年06月08日
  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 
  #include 
  #include 
  #include 
  #include 
  #include 
  /*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;
  }

猜你喜欢

转载自zn108zn.iteye.com/blog/1364673
今日推荐