是否有可能触发 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/