3

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

我已经使用 nanosleep 实现了它,如下所示。每 500 毫秒调用一次函数“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

4 回答 4

2

您应该阅读time(7)(也许还有signal(7) ...)。您可能需要一些事件循环(至少如果您的程序正在执行某些输入)。该循环基于像poll(2)这样的多路复用系统调用(另请参见这个那个答案)。许多库提供事件循环,特别是libeventlibev、Gtk/Glib、Qt...

在 Linux 上,您可能还会timerfd_create(2)感兴趣(以及其他更传统的解决方案)。

并阅读高级 Linux 编程

于 2013-10-18T10:42:05.307 回答
2

timer_create 将是您要查找的系统调用。

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

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

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

有关这方面的更多信息,请参见 timer_create 手册页。

于 2013-10-18T11:45:02.963 回答
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

于 2013-10-18T10:11:55.627 回答
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。

于 2013-10-18T10:18:17.730 回答