如果在关机前保存数据?
假设自己写一个服务程序,开机后自动运行,是一个后台服务程序。
如果其它用户通过其它命令(比如root用户输入reboot命令)或其它程序要关闭计算机,我的程序会收到SIGTERM信号,但捕捉不到SIGKILL信号,收到SIGTERM信号后如何开始保存自己的数据到磁盘上呢?
我的测试代码如下:
- /************然后我来专门处理关机时收到的信号15**********************/
- #include <signal.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- void sighandler(int);
- int main(int argc, char ** argv)
- {
- int x = 0;
- signal(SIGTERM, sighandler);
- signal(SIGQUIT, sighandler);
- while(1) {
- /*printf("now %dn", x++);*/
- usleep(100);
- }
- }
- void sighandler(int sig)
- {
- FILE * fp;
- int x = 0;
- fp = fopen("haltsignal.txt", "a+");
- if(!fp) return;
- fprintf(fp, "signal.%d received, now begin to save data:n", sig);
- for(x = 1; x <= 5; x++) {fprintf(fp, "save data.%dn", x); fflush(fp);}
- fclose(fp);
- }
复制代码
当这个程序运行起来,在另一个终端输入reboot命令,然后再看haltsignal.txt却没有内容。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
更多
发布评论
评论(9)
感谢x2 和 flw 的提示,本人已经试验成功!
首先,各位查看一下自己的/etc/inittab看看这:
# The default runlevel.
id:2:initdefault:
当然,大家知道这是当前运行级别。比如我这里是运行级别为2
然后,编写这样一个测试脚本/etc/init.d/my-start-stop,内容如下:
复制代码
然后在当前运行级别所属目录/etc/rc2.d里面创建启动链接:
在/etc/rc0.d目录里面创建关闭链接:
输入halt -p命令关机看看吧,肯定能看到屏幕提示:
“Stopping my-start-stop server”
然后等待10秒钟。
再开机肯定会看到屏幕提示:
“Starting my-start-stop server”
如果大家感兴趣可以看一下我之前发的贴“Linux下XWindow系统启动脚本分析”
http://bbs.chinaunix.net/viewthread.php?tid=721285&highlight=zhoulifa
按照 SysV 的设计思路和规范,是应该加 K* 脚本而不是 S* 脚本。
在 /etc/rc0.d 和 /etc/rc6.d 中放 S 开头的脚本比较好。
如无意外:
/etc/rc0.d 包含关机脚本
/etc/rc6.d 包含重启脚本
S:启用
[ 本帖最后由 x2 于 2006-9-2 09:38 编辑 ]
不知道你用的是什么发行版,
我觉得最稳妥的方法不是加什么 SIGTERM,
而是在 /etc/rc3.d/ 里面加 K??* 脚本,
K 打头的脚本在重启或者是关机的时候,会被 /etc/rc.d/rc 脚本自动调用。
这样你就有机会保存你的数据。
用 syslog 在 signal handle 里记录,重启后看记录文件确定是否调用过。
一般发行版都有在关机指令前先kill -1 的动作,所以这个程序应该是可以收到SIGTERM信号的
你的程序收不到这个信号, 自然不可能有所反映了
写一个服务, 关机时给你的程序发个信号.
SIGQUIT 是当键盘要求停止执行时,CTRL+,则会产生此信号。 执行reboot是否产生此信号就不知道了。