我想写一个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中生成一个定期线程?或者,使用一些计时器回调?
答案 0 :(得分:2)
您应该阅读time(7)(也许signal(7) ...)。你可能想要一些event loop(至少如果你的程序正在做一些输入)。该循环基于多路复用系统调用,如poll(2)(另请参阅this和that答案)。许多库提供事件循环,特别是libevent,libev,Gtk / Glib,Qt,......
在Linux上,你可能 对timerfd_create(2)感兴趣(除了其他更传统的解决方案)。
答案 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。