- 论坛徽章:
- 0
|
有了上面这个例子,我们就可以完成一个关机前保存数据的程序了。
首先,C程序代码如下:
- #include <sys/types.h>
- #include <time.h>
- #include <signal.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #define SIGTOCAP SIGTERM
- void sighandler(int);
- char status;
- time_t t;
- /************关于本文档********************************************
- *filename: SaveData.c
- *purpose: 展示如何在关机前保存数据
- *wrote by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com)
- Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言
- *date time:2006-09-02 22:11:54
- *Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
- * 但请遵循GPL
- *Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力
- * 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献!
- *********************************************************************/
- int main(int argc, char ** argv)
- {
- FILE * fp = 0;
- if(fork()) exit(0);
- if(fork()) exit(0); /* 变成 daemon 精灵程序进行后台服务 */
- signal(SIGTOCAP, sighandler); /* 捕捉退出信号 */
- if(!(fp = fopen("/var/run/save-data.pid", "w"))) {
- fprintf(stdout, "cannot open file '/var/run/save-data.pid'\n");
- exit(1);
- }
- fprintf(fp, "%d\n", getpid()); /* 保存运行程序的 pid */
- fclose(fp);
- if(!(fp = fopen("/home/test/running.data", "a+"))) {
- fprintf(stdout, "cannot open file '/home/test/running.data'\n");
- exit(1);
- }
- status = 0;
- while(1) {
- t = time(0);
- fprintf(fp, "now running at %s\n", ctime(&t)); /* 每隔一定时间写一些数据,表明程序在运行 */
- if(status) break; /* 如果收到退出信号,并保存完数据, 则退出程序运行 */
- usleep(1000000);
- }
- fclose(fp);
- remove("/var/run/save-data.pid"); /* 退出前删除 pid 文件 */
- return 0;
- }
- void sighandler(int sig)
- {
- FILE * fp = 0;
- int i = 0;
- if(sig == SIGTOCAP) { /* 捕捉到退出信号后开始保存数据 */
- if(!(fp = fopen("/home/test/saving.data", "a+"))) {
- fprintf(stdout, "cannot open file '/home/test/saving.data'\n");
- exit(-1);
- }
- for(i = 0; i < 10000; i++) {
- t = time(0);
- fprintf(fp, "now get ready to exit at %s\n", ctime(&t));
- }
- fclose(fp);
- status= 1; /* 数据保存完毕,设置退出标志 */
- }
- }
复制代码
然后编译此程序:
gcc SaveData.c -o save-data
再把这个程序放到/bin目录下去:
然后编写一个脚本/etc/init.d/save-data,内容如下:
- #!/bin/sh
- #
- # $Id: save-data.init.d,v 1.0.0.0 2006/09/02 22:11:54
- #
- test -x /bin/save-data || exit 0
- MYPID=/var/run/save-data.pid
- case "$1" in
- start)
- echo -n "Starting save-data daemon: "
- echo -n ""
- sleep 10 # Just for test , you'd better delete this line for use
- start-stop-daemon --start --quiet --pidfile $MYPID --exec /bin/save-data
- if [ -f "$MYPID" ] && ps h `cat "$MYPID"` >/dev/null; then
- echo " OK."
- else
- echo " Failed."
- fi
- ;;
- stop)
- echo -n "Stopping save-data daemon: save-data"
- echo -n ""
- sleep 10 # Just for test , you'd better delete this line for use
- start-stop-daemon --stop --quiet --pidfile $MYPID
- echo "."
- ;;
- restart | force-reload)
- $0 stop
- sleep 2
- $0 start
- ;;
- *)
- echo "Usage: /etc/init.d/save-data {start|stop|restart}"
- exit 1
- esac
- exit 0
复制代码
再创建链接:
ln -s /etc/init.d/save-data /etc/rc2.d/S70save-data
ln -s /etc/init.d/save-data /etc/rc0.d/K10save-data
然后重启机器试试,会看到数据被保存到saving.data文件里了 |
|