【问题标题】:Trigger a clean shutdown of a C application on Linux在 Linux 上触发 C 应用程序的完全关闭
【发布时间】:2019-03-29 13:04:35
【问题描述】:

是否可以在 Linux 系统上触发用 C 编写的应用程序的“干净”关闭? “干净”是指用于取消初始化接口等的解决方案。就像 C++ 中对象的析构函数,但对于我的 C 应用程序。

我知道可以使用 systemd 关闭服务,但我的应用程序不是服务。我正在使用 systemd.service 来启动我的应用程序,但就我对 systemd 服务的理解而言,应用程序本身被认为是一次性的(一开始有一个初始化,然后进入 while (1) 循环)。

是否可以使用 systemd 或类似的 Linux 功能打破循环?这种问题的“标准”解决方案是什么?

int main (int argc, char **argv){
  // ... some initialization
  printf("Warming up!\n);

  while(keepRunning){
    // do stuff
    printf("Running!!\n");
  }
  // de-initialize
  printf("By by\n");
}

我希望 systemd 将 keepRunning 的值更改为 0。但我认为这太容易了。

【问题讨论】:

  • 这个程序的目的是什么?它应该解决什么问题?它应该运行多长时间?结束的条件是什么?
  • 也许man 3 signal 有帮助。
  • 它会计算 pi,直到系统告诉它停止(类似于 systemds ExecStop?),然后它会打印出它能够计算的位数以及花了多长时间。它结束的条件是系统关闭或另一个应用程序试图更新可执行文件。
  • 这个应用程序的确切目的是一篇更长的文章,因此是计算 pi 的摘要。
  • 好吧,系统关闭我认为真的没有必要做任何事情,它应该让自己被杀死(无论如何结果在那一刻并不有趣)。要呈现当前结果,您可以捕获 SIGUSR1SIGUSR2 信号之一,然后继续处理。为了退出并展示当前结果,SIGINT 怎么样?

标签: c linux kill shutdown


【解决方案1】:
  • 为应该在不跳过清理代码的情况下终止应用的信号设置信号处理程序(在其 sigaction 的 .sa_flags 中没有 SA_RESTART 标志)。
  • 让信号处理程序设置一个 atomic/sig_atomic_t 标志(或清除您的 keepRunning 标志,但通常相反,以便您可以使用它来记录信号编号)。
  • 当您收到EINTR 或任何其他时间时,检查该标志并在设置时开始失败。 (即,如果在 C 中,则开始返回失败信号返回值,或者在 C++ 中抛出异常。)

【讨论】:

    猜你喜欢
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    相关资源
    最近更新 更多