我在我的C程序中尝试检测Linux的关机或重启。 我发现程序可以使用signal(SIGTERM, handler)和(SIGKILL, handler)。 但是如果用户用命令杀死进程,这两个也会被触发。
有些解决方案称可以使用runlevel,但它不起作用。 不知道进程是否在系统初始化runlevel之前被杀死。 我甚至尝试将脚本放置在rcx.d中,但仍然无法工作。
有人有建议吗? 我需要在许多种Linux系统上运行。
谢谢。
[更新] 我使用了R解决方案,但我仍然没有看到我的数据在重新启动或关闭时被清除。 是我的函数有问题吗?
int start() {
if (initIni() == EXIT_FAILURE)
return EXIT_FAILURE;
struct sigaction act;
memset(&act, '\0', sizeof(act));
act.sa_sigaction = &signal_callback_handler;
act.sa_flags = SA_SIGINFO;
sigaction(SIGTERM, &act, NULL);
....
}
void signal_callback_handler(int signum, siginfo_t *siginfo, void *context) {
if (signum == SIGTERM && (long)siginfo->si_pid == 1) {
clearData();
}
exit(signum);
}
[更新] 最终,我使用了David Schwartz的runlevel(8) 示例 来解决我的问题。 如果您使用Linux命令runlevel将不会有用。 感谢提供这个好的解决方案。