c - 在 C 中每 x 秒执行一个方法

标签 c linux ubuntu timer intervals

是否有一个工作定时器的例子,它使用 C 每 x 秒执行一些功能。

我会很感激一个示例工作代码。

最佳答案

你可以产生一个新线程:

void *threadproc(void *arg)
{
    while(!done)
    {
        sleep(delay_in_seconds);
        call_function();
    }
    return 0;
}
...
pthread_t tid;
pthread_create(&tid, NULL, &threadproc, NULL);

或者,您可以使用 alarm(2) 设置闹钟或 setitimer(2) :

void on_alarm(int signum)
{
    call_function();
    if(!done)
        alarm(delay_in_seconds);  // Reschedule alarm
}
...
// Setup on_alarm as a signal handler for the SIGALRM signal
struct sigaction act;
act.sa_handler = &on_alarm;
act.sa_mask = 0;
act.sa_flags = SA_RESTART;  // Restart interrupted system calls
sigaction(SIGALRM, &act, NULL);

alarm(delay_in_seconds);  // Setup initial alarm

当然,这两种方法都有一个问题,即您定期调用的函数需要是线程安全的。

signal 方法特别危险,因为它还必须是异步安全的,这很难做到——即使像 printf 这样简单的方法也是不安全的,因为 printf可能会分配内存,如果 SIGALRM 中断了对 malloc 的调用,您就会遇到麻烦,因为 malloc 不可重入。所以我不推荐信号方法,除非你所做的只是在信号处理程序中设置一个标志,该标志稍后会被其他一些函数检查,这会让你回到与线程版本相同的位置。

关于c - 在 C 中每 x 秒执行一个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13923885/

相关文章:

c - linux/input.h 和按键记录

c - fread() 操作将错误的数据补充到结构中

python - 来自 python 字符串的 C 字符数组

C recv() 不读取缓冲区

c - 多线程没有明显的性能提升

python - 从 crontab 运行 python 时出现问题 - "invalid Python installation"

ruby-on-rails - 为什么我每次打开新终端都必须安装 Rails?

python自动邮件回复系统

c - sendto() "invalid argument"错误,Linux 上的 IPv6 原始 udp 套接字

c - 查找进程的最大子进程(非兄弟进程)(task_struct)