Linux中的定期任务

时间:2013-10-18 10:06:40

标签: c linux multithreading timer

我想写一个C程序,它会定期执行某些任务(比如在控制台上打印一些东西)。

我使用nanosleep实现了它,如下所示。每500ms调用一次函数'func'。

#include <stdio.h>
#include <time.h>

void func(void);

int main()
{
  struct timespec mytimespec;
  mytimespec.tv_sec = 0;
  mytimespec.tv_nsec = 500000000; /* 500 ms */

  while(1)
  {
    func(); 
    nanosleep(&mytimespec,NULL);
  }
  return 0;
}

void func(void)
{
  printf("This would be printed periodically\n");
}

以上工作正常。不过我有些疑惑: -

  • 如果有多个线程并且一个线程依赖nanosleep执行定期任务,它是否会正常工作?

  • 有没有办法在linux中生成一个定期线程?或者,使用一些计时器回调?

4 个答案:

答案 0 :(得分:2)

您应该阅读time(7)(也许signal(7) ...)。你可能想要一些event loop(至少如果你的程序正在做一些输入)。该循环基于多路复用系统调用,如poll(2)(另请参阅thisthat答案)。许多库提供事件循环,特别是libeventlibev,Gtk / Glib,Qt,......

在Linux上,你可能 timerfd_create(2)感兴趣(除了其他更传统的解决方案)。

阅读Advanced Linux Programming

答案 1 :(得分:2)

timer_create将是您正在寻找的系统调用。

它有一个sigaction结构,指定应该调用回调的方式。

你必须在timer_settime函数的newvalue参数中初始化成员it_interval,以便每隔it_interval调用在sigaction结构中注册的函数。

该函数可以是一个信号处理程序,一个将在计时器到期时运行的线程。

有关详细信息,请参阅timer_create手册页。

答案 2 :(得分:1)

  

如果有多个线程并且一个线程依赖nanosleep来执行周期性任务,它会正常工作吗?

函数nanosleep()不会在您的参数中指定的时间之前返回(除非它被信号处理程序中断或遇到错误)。但它可能会在稍后返回(通常只是稍后)。

请查看以下文章: http://www.drdobbs.com/soft-real-time-programming-with-linux/184402031 - 它似乎以一种很好的方式解释了计时器。

  

有没有办法在linux中生成一个定期线程?或者,使用一些计时器回调?

查看计时器:http://man7.org/linux/man-pages/man2/timer_create.2.html

答案 3 :(得分:1)

取决于任务有很多种方式:

1)你可以使用实时时钟(man rtc)

2)你可以使用cron(按计时器产生任何进程)

3)你可以使用select / pselect(它适用于周期性线程产生的小时间间隔)

/* Wait up to five seconds. */
           tv.tv_sec = 5;
           tv.tv_usec = 0;

           retval = select(1, 0, 0, 0, &tv);

如果你正在监视文件/目录,你可以使用inotify。