<acronym id='hlrig'><em id='hlrig'></em><td id='hlrig'><div id='hlrig'></div></td></acronym><address id='hlrig'><big id='hlrig'><big id='hlrig'></big><legend id='hlrig'></legend></big></address>
    1. <dl id='hlrig'></dl>
    2. <fieldset id='hlrig'></fieldset>

      <span id='hlrig'></span>
        <i id='hlrig'></i>

          <ins id='hlrig'></ins>

          <code id='hlrig'><strong id='hlrig'></strong></code>
          <i id='hlrig'><div id='hlrig'><ins id='hlrig'></ins></div></i>

          1. <tr id='hlrig'><strong id='hlrig'></strong><small id='hlrig'></small><button id='hlrig'></button><li id='hlrig'><noscript id='hlrig'><big id='hlrig'></big><dt id='hlrig'></dt></noscript></li></tr><ol id='hlrig'><table id='hlrig'><blockquote id='hlrig'><tbody id='hlrig'></tbody></blockquote></table></ol><u id='hlrig'></u><kbd id='hlrig'><kbd id='hlrig'></kbd></kbd>
          2. 如何在Linux下实现定时器

            • 时间:
            • 浏览:6
            • 来源:124软件资讯网

              在Linux实现一个准时器  ,不像Win32下那样直观  。在Win32挪用SetTimer就行了 ,在Linux下则没有响应函数可以直接挪用  。准时器作为一个常用的功效  ,在Linux固然也有响应实现  。下面我们看看几种常用的要领  。

              要实现准时器功效  ,最土的措施实现莫过于用sleep/usleep来实现了  。固然 ,它会壅闭当前线程  ,除了处置惩罚准时功效外 ,什么活也干不了 。固然要解决这个问题不难  ,建立一个单独的线程来卖力准时器  ,其它线程卖力正常的使命就行了 。

              要实现准时器功效  ,最简朴的措施就是ALarm信号  。这种要领简朴  ,也响应的缺陷:用信号实现效率较低;最小精度为1秒  ,无法实现高精度的界说器  。简朴示例:

              #include
              #include
              static void timer(int sig) {
              if(sig == SIGALRM) {
              printf("timer\n");
              }
              return;
              }

              int main(int argc, char* argv[]) {
              signal(SIGALRM, timer);
              alarm(1);
              getchar();
              return 0;
              }


              (setitimer和alarm有类似的功效 ,也是通过信号来实现)

              最优雅的要领是使用RTC机制 。使用select函数  ,你可以用单线程实现准时器  ,同时还可以处置惩罚其它使命  。简朴示例:

              #include
              #include
              #include
              #include
              #include
              #include
              #include
              #include

              int main(int argc, char* argv[]) {
              unsigned long i = 0;
              unsigned long data = 0;
              int retval = 0;
              int fd = open ("/dev/rtc", O_RDONLY);

              if(fd < 0) {
              perror("open");
              exit(errno);
              }


              if(ioctl(fd, RTC_IRQP_SET, 4) < 0) {
              perror("ioctl(RTC_IRQP_SET)");
              close(fd);
              exit(errno);
              }

              if(ioctl(fd, RTC_IRQP_SET, 4) < 0) {
              perror("ioctl(RTC_IRQP_SET)");
              close(fd);
              exit(errno);
              }


              if(ioctl(fd, RTC_PIE_ON, 0) < 0) {
              perror("ioctl(RTC_PIE_ON)");
              close(fd);
              exit(errno);
              }

              for(i = 0; i < 100; i++) {
              if(read(fd, &data, sizeof(unsigned long)) < 0) {
              perror("read");
              close(fd);
              exit(errno);
              }
              printf("timer\n");
              }


              ioctl(fd, RTC_PIE_OFF, 0);
              close(fd);
              return 0;
              }