我正在尝试在我的c程序中检测从Linux关闭或重新启动。我发现程序可以使用signal(SIGTERM,handler)(SIGKILL,handler)。但是,如果用户也使用命令杀死该进程,这两个触发器也会触发。
他们说,在某些解决方案中,可以使用运行级别,但无法运行。在系统初始化运行级别之前,不知道该进程是否被杀死。我什至尝试将脚本放在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命令运行级别,它将不会有用。感谢您的出色解决方案。
赶上SIGTERM。在处理程序中,读取/var/run/utmp文件以获取运行级别。请参阅命令的源代码以runlevel(8)供参考。
/var/run/utmp
runlevel(8)