【发布时间】:2014-02-25 09:23:31
【问题描述】:
我正在尝试在我的 c 程序中检测从 Linux 关闭或重新启动。 我发现该程序可以使用信号(SIGTERM,处理程序)(SIGKILL,处理程序)。 但是如果用户用命令杀死进程,这两个也会触发。
在某些解决方案中,他们说可以使用运行级别,但它不起作用。 不知道进程是否在系统初始化运行级别之前被杀死。 我什至尝试将脚本放在 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) example 来解决我的问题。 如果您使用 linux 命令运行级别,它将没有用。 感谢您提供出色的解决方案。
【问题讨论】:
-
你想用这个关机/重启信号做什么?重启进程,例如?
-
硬件和软件信号有区别。
-
注意 SIGKILL 不能被捕获!
-
我会使用信号清除一些数据