Chinaunix首页 | 论坛 | 博客
  • 博客访问: 192013
  • 博文数量: 27
  • 博客积分: 725
  • 博客等级: 上士
  • 技术积分: 347
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-04 09:01
文章分类

全部博文(27)

文章存档

2012年(15)

2011年(12)

分类: C/C++

2012-03-27 19:01:41

原理很简单,就是像闹钟一样,隔一段时间就滴答一次,可以设置时间间隔的。
  1. #include <apue.h>

  2. static volatile sig_atomic_t sigalrm;

  3. static void sig_alrm(int signo)
  4. {
  5.     sigalrm = 1;
  6.     write(STDERR_FILENO, "\a", 2);
  7. }

  8. int main(int argc, char **argv)
  9. {
  10.     int                 nsec;
  11.     sigset_t            set;
  12.     struct    sigaction    act;
  13.     struct     itimerval    timer;

  14.     if (argc != 2)
  15.         err_quit("argc == 2");

  16.     daemon(0, 1);

  17.     nsec = atoi(argv[1]);
  18.     
  19.     timer.it_value.tv_sec = nsec;
  20.     timer.it_value.tv_usec = 0;
  21.     timer.it_interval.tv_sec = nsec;
  22.     timer.it_interval.tv_usec = 0;
  23.     
  24.     if (setitimer(ITIMER_REAL, &timer, NULL))
  25.         err_sys("setitimer error");
  26.     
  27.     if (sigemptyset(&set) < 0)
  28.         err_sys("sigemptyset error");

  29.     if (sigaddset(&set, SIGALRM) < 0)
  30.         err_sys("sigaddset error");

  31.     if (sigprocmask(SIG_BLOCK, &set, NULL) < 0)
  32.         err_sys("sigprocmask error");
  33.     
  34.     if (sigemptyset(&set) < 0)
  35.         err_sys("sigemptyset error");

  36.     act.sa_flags = 0;
  37.     act.sa_handler = sig_alrm;
  38.     
  39.     if (sigemptyset(&act.sa_mask) < 0)
  40.         err_sys("sigemptyset error");

  41.     if (sigaction(SIGALRM, &act, NULL) < 0)
  42.         err_sys("sigaction error");

  43.     for ( ; ; ) {

  44.         sigsuspend(&set);

  45.         if (sigalrm) {
  46.             sigalrm = 0;
  47.         }

  48.     }

  49.     return 0;
  50. }

阅读(1660) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~