【问题标题】:Is there a proper way to write a program that runs continuously有没有正确的方法来编写一个连续运行的程序
【发布时间】:2017-01-06 05:56:35
【问题描述】:

我想在我的计算机上连续执行一个 C 程序。它实际上不需要“做”任何事情,直到它识别出 event

例如,可以使用永不退出的do while 循环编写 C 程序。在循环内部,可能有一个if else 条件来侦听event。让我们说“if 一个文件存在于一个目录中,然后打开文件并做一些事情,else 休息一下,sleep(60) 一会儿”。

当然,这个功能可以在 C 程序之外实现。我可以在 shell 脚本中运行上面相同的想法...“if 一个文件存在于一个目录中,然后运行 ​​C 程序,else 休息一下,sleep(60) 一会儿”。如果文件存在,我还可以编写一个 shell 脚本来执行 C 程序,并使用 crontab 或其他调度程序运行 shell 程序。

如果我没有运行sleep 或者我将crontab 设置为非常高的频率,那么显然我的响应时间会提高。虽然这是理想的,但我怀疑这是一种安全且正确的方法。我基本上希望我的程序始终准备好采取行动...event 发生,开始工作!

由于我从未实现过这样的程序,我的问题是,是否有一种适当且安全的方法来创建服务于此类功能的“事件侦听器”? C与shell方法?其他想法?

【问题讨论】:

  • 这取决于事件。 man selectman epoll
  • 至于一般看目录,而不是特定文件的存在,另见e.g. man inotify。可用于检查是否在目录中创建了特定文件。
  • @WilliamPursell 坚持我的问​​题的上下文,事件将是“文件的存在”。不过,我会检查每一个
  • 哦我忘了说inotify是Linux特有的,但其他主要操作系统也有这样的功能。
  • 看看如何守护程序,如何在系统启动时启动守护程序,以及如何(异步)侦听您感兴趣的事件。此外,您的问题是范围极广,无法在单一答案的范围内得到合理的回答。

标签: c linux shell cron


【解决方案1】:

您真正想要的是在进程之间进行通信。 可以使用 'sleep()' 并检查条件,但这不是 CPU 消耗的最佳方式。

有几种方法可以在进程之间进行通信,我知道这些:

  1. 管道
  2. 共享内存
  3. 插座
  4. 先进先出

最好启动管道: 当您有 2 个程序并且您希望程序 #1 等待来自程序 #2 的某个事件时,可以使用此选项。 我找到了一个示例 here,但在 google 中还有很多其他示例。

之后我会继续使用套接字。一个例子是here,但同样,网络上还有更多。

为了进一步阅读,我建议您在“进程间通信”一章中查找“高级 Linux 编程”一书。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    相关资源
    最近更新 更多