- 論壇徽章:
- 0
|
有了上面這個例子,我們就可以完成一個關(guān)機前保存數(shù)據(jù)的程序了。
首先,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;
- /************關(guān)于本文檔********************************************
- *filename: SaveData.c
- *purpose: 展示如何在關(guān)機前保存數(shù)據(jù)
- *wrote by: zhoulifa(zhoulifa@163.com) 周立發(fā)(http://zhoulifa.bokee.com)
- Linux愛好者 Linux知識傳播者 SOHO族 開發(fā)者 最擅長C語言
- *date time:2006-09-02 22:11:54
- *Note: 任何人可以任意復(fù)制代碼并運用這些文檔,當(dāng)然包括你的商業(yè)用途
- * 但請遵循GPL
- *Hope:希望越來越多的人貢獻自己的力量,為科學(xué)技術(shù)發(fā)展出力
- * 科技站在巨人的肩膀上進步更快!感謝有開源前輩的貢獻!
- *********************************************************************/
- int main(int argc, char ** argv)
- {
- FILE * fp = 0;
- if(fork()) exit(0);
- if(fork()) exit(0); /* 變成 daemon 精靈程序進行后臺服務(wù) */
- 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)); /* 每隔一定時間寫一些數(shù)據(jù),表明程序在運行 */
- if(status) break; /* 如果收到退出信號,并保存完數(shù)據(jù), 則退出程序運行 */
- 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) { /* 捕捉到退出信號后開始保存數(shù)據(jù) */
- 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; /* 數(shù)據(jù)保存完畢,設(shè)置退出標志 */
- }
- }
復(fù)制代碼
然后編譯此程序:
gcc SaveData.c -o save-data
再把這個程序放到/bin目錄下去:
然后編寫一個腳本/etc/init.d/save-data,內(nèi)容如下:
- #!/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
復(fù)制代碼
再創(chuàng)建鏈接:
ln -s /etc/init.d/save-data /etc/rc2.d/S70save-data
ln -s /etc/init.d/save-data /etc/rc0.d/K10save-data
然后重啟機器試試,會看到數(shù)據(jù)被保存到saving.data文件里了 |
|