【问题标题】:Asynchronous, timed function calling in C on Linux?Linux 上的 C 语言中的异步定时函数调用?
【发布时间】:2010-09-14 10:07:21
【问题描述】:

在 Linux 上的 C 中,在一定延迟后异步调用函数(如 JavaScript 的 setTimeout)或设置重复计时器定期调用它(类似于 setInterval)的最简单、最有效的方法是什么?

虽然这个问题适用于Linux,但我希望有一个跨平台的方法。

【问题讨论】:

  • 标准 C 中没有这样的功能。请指定您的平台,以便提供特定于平台的解决方案。
  • 感谢您告诉我。我已经编辑了我的答案以添加更多细节。
  • 您要求的是操作系统(计时器)服务。我怀疑你会在任何语言中找到它。
  • 如果这在你所说的任何语言中都不可能,那么具有此功能的语言(例如 JavaScript)如何实现异步函数调用?
  • JavaScript 不仅是一门语言,它还是一个充满对象、封装环境的平台。 JavaScript 不会在空白中运行。 C 是一种语言,它独立于平台(例如 POSIX 或 Windows)进行标准化。而且 C 语言太习惯于开发系统程序,这些程序实际上可以在除了裸硬件之外没有任何东西的环境中运行。

标签: c linux asynchronous timer


【解决方案1】:

最简单的Linux特定解决方案是使用alarm函数:

void alarm_handler (int signum)
{
    printf ("Five seconds passed!\n");
}

signal (SIGALRM, alarm_handler);
alarm (5);

getitimersetitimer 函数可用于创建精度更高的计时器。 (more...)。

【讨论】:

  • 是否有任何毫秒或更高精度的工具?秒级精度并不总是足够的。
  • @Delan:然后使用setitimer() 而不是alarm()
【解决方案2】:

有两种方法:

首先,正如另一个答案中提到的,是使用alarm()setitimer() 触发的信号。这两个功能在任何遵循 POSIX 的操作系统中都可用;还有第三个函数ualarm(),它在 2008 年被淘汰。不利的一面是,在信号处理程序中执行任何重要的事情(例如,I/O 或其他系统调用)都是不安全的,所以你真正想做的可能只是设置一个标志,让其他东西捡起它。

第二种是使用一个线程休眠一定的时间间隔,然后调用你的函数。 POSIX 将线程标准化为 1990 年代初期的扩展,大多数支持线程的现代操作系统都支持 POSIX 线程。这里的陷阱是您必须了解让两个执行上下文共享相同数据空间的含义并相应地设计您的程序,否则您将遇到可能是调试噩梦的问题。

请注意,警报和睡眠仅承诺在至少指定的时间过去后执行它们所做的事情,因此无法保证您在实时操作系统。

【讨论】:

    猜你喜欢
    • 2012-09-16
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 2019-01-20
    • 2020-11-17
    • 1970-01-01
    相关资源
    最近更新 更多