方法一:使用信号量SIGALRM + alarm()
    这种方式的精度能达到1秒,其中利用了*nix系统的信号量机制,首先注册信号量SIGALRM处理函数,调用alarm(),设置定时长度,代码示例如下:

    1. #include <stdio.h>
    2. #include <signal.h>
    3. void timer(int sig)
    4. {
    5. if(SIGALRM == sig)
    6. {
    7. printf("timer\n");
    8. alarm(1); //we contimue set the timer
    9. }
    10. return ;
    11. }
    12. int main()
    13. {
    14. signal(SIGALRM, timer); //relate the signal and function
    15. alarm(1); //trigger the timer
    16. getchar();
    17. return 0;
    18. }

    方法二:使用RTC机制
    RTC机制利用系统硬件提供的Real Time Clock机制,通过读取RTC硬件/dev/rtc,通过ioctl()设置RTC频率,代码示例如下:

    1. #include <stdio.h>
    2. #include <linux/rtc.h>
    3. #include <sys/ioctl.h>
    4. #include <sys/time.h>
    5. #include <sys/types.h>
    6. #include <fcntl.h>
    7. #include <unistd.h>
    8. #include <errno.h>
    9. #include <stdlib.h>
    10. int main(int argc, char* argv[])
    11. {
    12. unsigned long i = 0;
    13. unsigned long data = 0;
    14. int retval = 0;
    15. int fd = open ("/dev/rtc", O_RDONLY);
    16. if(fd < 0)
    17. {
    18. perror("open");
    19. exit(errno);
    20. }
    21. /*Set the freq as 4Hz*/
    22. if(ioctl(fd, RTC_IRQP_SET, 1) < 0)
    23. {
    24. perror("ioctl(RTC_IRQP_SET)");
    25. close(fd);
    26. exit(errno);
    27. }
    28. /* Enable periodic interrupts */
    29. if(ioctl(fd, RTC_PIE_ON, 0) < 0)
    30. {
    31. perror("ioctl(RTC_PIE_ON)");
    32. close(fd);
    33. exit(errno);
    34. }
    35. for(i = 0; i < 100; i++)
    36. {
    37. if(read(fd, &data, sizeof(unsigned long)) < 0)
    38. {
    39. perror("read");
    40. close(fd);
    41. exit(errno);
    42. }
    43. printf("timer\n");
    44. }
    45. /* Disable periodic interrupts */
    46. ioctl(fd, RTC_PIE_OFF, 0);
    47. close(fd);
    48. return 0;
    49. }

    方法三:使用select()
    这种方法比较冷门,通过使用select(),来设置定时器;原理利用select()方法的第5个参数,第一个参数设置为0,三个文件描述符集都设置为NULL,第5个参数为时间结构体,代码如下:

    1. #include <sys/time.h>
    2. #include <sys/select.h>
    3. #include <time.h>
    4. #include <stdio.h>
    5. /*seconds: the seconds; mseconds: the micro seconds*/
    6. void setTimer(int seconds, int mseconds)
    7. {
    8. struct timeval temp;
    9. temp.tv_sec = seconds;
    10. temp.tv_usec = mseconds;
    11. select(0, NULL, NULL, NULL, &temp);
    12. printf("timer\n");
    13. return ;
    14. }
    15. int main()
    16. {
    17. int i;
    18. for(i = 0 ; i < 100; i++)
    19. setTimer(1, 0);
    20. return 0;
    21. }

    总结:
    RTC机制和select()机制精度均能够达到微妙级别。
    网上有很多基于select()的多线程定时器,说明select()稳定性还是非常好。