c - 在 Linux 上触发 C 应用程序的干净关闭

标签 c linux kill shutdown

是否有可能触发 Linux 系统上用 C 编写的应用程序的“干净”关闭? “干净”是指用于取消初始化接口(interface)等的解决方案。就像 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。但我认为这太容易了。

最佳答案

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

关于c - 在 Linux 上触发 C 应用程序的干净关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55418051/

相关文章:

c - 如何将原始数据转换为来自 LSM303DLHC 传感器的有用温度

linux - awk 将值与输入进行比较

cocoa - Mac OS X : Quickest way to kill/quit an entire process tree from within a Cocoa application

c# - 线程未读取

c - linux x86_64 vm gcc 可执行输出架构错误,exec 文件格式错误

android - 即使操作系统终止应用程序,如何在android中保存/恢复全局变量

windows - 在 Windows 中切断/终止 TCP 连接

c - Emacs -*- lang -* 标签和旧式 K&R C

c - 使用 RSA 将用 C 编写的 Http 服务器转换为 HTTPS

c - 当调用 dlclose 时共享库中的全局变量会发生什么?