这个版本相对第一版更新了很多,其实我本地定义为第五版的。相对第一版主要更新内容:
1.增加了定时器
2.用户可以停止调备份程序
3.如果备份程序正在运行,那么尝试运行提示已经在运行
4.记录程序运行时的pid信息
5.支持** start;** restart;** stop等命令
还有其他细节的更新。
不足:restart的支持还不是很完美,因为没有考虑到服务器繁忙等情况。
运行示例:
编译:
gcc -o main main.c
运行:
./main
重启
./main restart
关闭
./main stop
#include<sys/types.h> #include<sys/wait.h> #include<ctype.h> #include<unistd.h> #include<string.h> #include<stdlib.h> #include<signal.h> #include<time.h> #include<stdio.h> //备份程序的pid #define PID_FILE "./pid.db" //备份数据库信息文件 #define DB_FILE "./db_list" //最多可以备份的数据库数量 #define NUM 20 //数据库名字最长字符数 #define LEN 128 //闹钟时间间隔 #define ALARM_TIME 10 //数据库名数组信息 char *db_list[NUM]; //当前备份数据库的数量 int read_num; //用户是否停止备份 int isbreak = 0; //申请内容 void malloc_dblist(); //释放申请的内存 void free_dblist(); //读取数据库信息 void readDbFile(); //型号处理函数 void signHandler(int sig); //记录程序运行的pid信息 int recordPid(int pid); //获取程序运行时的pid信息 int readPid(void); //移除程序运行时的pid信息 void delPid(void); int main(int argc, char *argv[]) { pid_t pid, old_pid; int i, prs; char buf[LEN]; time_t t; struct tm *tm_ptr; struct sigaction act, oldact; sigset_t newmask, suspmask, oldmask; if (argc >= 2) { old_pid = (pid_t)readPid(); //停止备份程序 if (strcmp(argv[1], "stop") == 0) { kill(old_pid, SIGINT); return 0; } else if (strcmp(argv[1], "restart") == 0) { kill(old_pid, SIGINT); sleep(5); } } old_pid = (pid_t)readPid(); //检测程序是否已经在运行 if (old_pid > 0) { fprintf(stderr, "Progress is running. "); return -1; } //记录程序运行的pid信息 prs = recordPid((int)getpid()); if (prs == -1) { fprintf(stderr, "Open pid.db file error. "); return -1; } readDbFile(); //注册信号处理 act.sa_handler = signHandler; sigemptyset(&act.sa_mask); act.sa_flags = 0; sigaction(SIGALRM, &act, 0); sigaction(SIGINT, &act, 0); while (1) { time(&t); tm_ptr = localtime(&t); for (i = 0; i < read_num; i++) { memset(buf, '