免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: zhoulifa
打印 上一主题 下一主题

如果在关机前保存数据? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-09-04 13:15 |只看该作者
有了上面这个例子,我们就可以完成一个关机前保存数据的程序了。

首先,C程序代码如下:


  1. #include <sys/types.h>
  2. #include <time.h>
  3. #include <signal.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <unistd.h>

  7. #define SIGTOCAP SIGTERM

  8. void sighandler(int);
  9. char status;
  10. time_t t;

  11. /************关于本文档********************************************
  12. *filename: SaveData.c
  13. *purpose: 展示如何在关机前保存数据
  14. *wrote by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com)
  15. Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言
  16. *date time:2006-09-02 22:11:54
  17. *Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
  18. * 但请遵循GPL
  19. *Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力
  20. *         科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献!
  21. *********************************************************************/
  22. int main(int argc, char ** argv)
  23. {
  24.   FILE * fp = 0;

  25.   if(fork()) exit(0);
  26.   if(fork()) exit(0); /* 变成 daemon 精灵程序进行后台服务 */

  27.   signal(SIGTOCAP, sighandler); /* 捕捉退出信号 */
  28.   if(!(fp = fopen("/var/run/save-data.pid", "w"))) {
  29.     fprintf(stdout, "cannot open file '/var/run/save-data.pid'\n");
  30.     exit(1);
  31.   }
  32.   fprintf(fp, "%d\n", getpid()); /* 保存运行程序的 pid */
  33.   fclose(fp);

  34.   if(!(fp = fopen("/home/test/running.data", "a+"))) {
  35.     fprintf(stdout, "cannot open file '/home/test/running.data'\n");
  36.     exit(1);
  37.   }
  38.   status = 0;
  39.   while(1) {
  40.     t = time(0);
  41.     fprintf(fp, "now running at %s\n", ctime(&t)); /* 每隔一定时间写一些数据,表明程序在运行 */
  42.     if(status) break; /* 如果收到退出信号,并保存完数据, 则退出程序运行 */
  43.     usleep(1000000);
  44.   }
  45.   fclose(fp);
  46.   remove("/var/run/save-data.pid"); /* 退出前删除 pid 文件 */
  47.   return 0;
  48. }

  49. void sighandler(int sig)
  50. {
  51.   FILE * fp = 0;
  52.   int i = 0;
  53.   if(sig == SIGTOCAP) { /* 捕捉到退出信号后开始保存数据 */
  54.     if(!(fp = fopen("/home/test/saving.data", "a+"))) {
  55.       fprintf(stdout, "cannot open file '/home/test/saving.data'\n");
  56.       exit(-1);
  57.     }
  58.     for(i = 0; i < 10000; i++) {
  59.       t = time(0);
  60.       fprintf(fp, "now get ready to exit at %s\n", ctime(&t));
  61.     }
  62.     fclose(fp);
  63.     status= 1; /* 数据保存完毕,设置退出标志 */
  64.   }
  65. }
复制代码


然后编译此程序:
gcc SaveData.c -o save-data

再把这个程序放到/bin目录下去:
mv save-data /bin


然后编写一个脚本/etc/init.d/save-data,内容如下:

  1. #!/bin/sh
  2. #
  3. # $Id: save-data.init.d,v 1.0.0.0 2006/09/02 22:11:54
  4. #

  5. test -x /bin/save-data || exit 0

  6. MYPID=/var/run/save-data.pid

  7. case "$1" in
  8.         start)
  9.                 echo -n "Starting save-data daemon: "
  10.                 echo -n ""
  11.                 sleep 10 # Just for test , you'd better delete this line for use
  12.                 start-stop-daemon --start --quiet --pidfile $MYPID --exec /bin/save-data
  13.                 if [ -f "$MYPID" ] && ps h `cat "$MYPID"` >/dev/null; then
  14.                         echo " OK."
  15.                 else
  16.                         echo " Failed."
  17.                 fi
  18.                 ;;
  19.         stop)
  20.                 echo -n "Stopping save-data daemon: save-data"
  21.                 echo -n ""
  22.                 sleep 10 # Just for test , you'd better delete this line for use
  23.                 start-stop-daemon --stop --quiet --pidfile $MYPID
  24.                 echo "."
  25.                 ;;
  26.         restart | force-reload)
  27.                 $0 stop
  28.                 sleep 2
  29.                 $0 start
  30.                 ;;
  31.         *)
  32.                 echo "Usage: /etc/init.d/save-data {start|stop|restart}"
  33.                 exit 1
  34. esac

  35. 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文件里了

论坛徽章:
0
12 [报告]
发表于 2006-09-04 13:18 |只看该作者
关于“ daemon 精灵程序 ” , 我这里只是简单的 fork 了两次,事实上还有其它许多工作要做,比如关闭终端, google 一下很多的,就不赘述了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP