c實現(xiàn)linux下的數(shù)據(jù)庫備份
更新時間:2015年07月19日 14:59:16 投稿:hebedich
本文給大家簡單介紹下c實現(xiàn)linux下的數(shù)據(jù)庫備份的方法和具體的源碼,十分的實用,有需要的小伙伴可以參考下。
Linux下c實現(xiàn)的數(shù)據(jù)庫備份,只要修改數(shù)據(jù)庫列表文件的信息即可。
db_list.txt把后綴去掉即可,一個數(shù)據(jù)庫一行。
1. main.c
#include<sys/types.h>
#include<sys/wait.h>
#include<ctype.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
//待備份的數(shù)據(jù)表文件(一個數(shù)據(jù)庫一行)
#define DB_FILE "./db_list"
//最多可以備份的數(shù)據(jù)庫數(shù)量
#define NUM 20
//一個數(shù)據(jù)庫名字的最長字符數(shù)
#define LEN 128
//保存從DB_FILE中讀取到的數(shù)據(jù)庫
char *db_list[NUM];
//從DB_FILE文件中讀取到的數(shù)據(jù)庫數(shù)量
int read_num;
//請求內存函數(shù)
void malloc_dblist();
//釋放內存函數(shù)
void free_dblist();
//讀取數(shù)據(jù)庫文件
void readDbFile();
int main(int argc, char *argv[]) {
pid_t pid;
int i;
char buf[LEN];
//從文件讀取數(shù)據(jù)庫信息
readDbFile();
pid = fork();
if (pid < 0) {
fprintf(stderr, "fork error\n");
exit(1);
}
switch (pid) {
case -1:
fprintf(stderr, "fork failed\n");
exit(1);
case 0:
//子進程進行數(shù)據(jù)庫的備份
for (i = 0; i < read_num; i++) {
memset(buf, '\0', LEN);
sprintf(buf, "%s%s%s%s%s", "mysqldump -uroot ", db_list[i], " > ", db_list[i], ".sql");
system(buf);
printf("%d,%s\n", i, buf);
}
break;
}
//等待子進程的結束
if (pid > 0) {
int stat_val;
pid_t child_pid;
child_pid = wait(&stat_val);
if (!WIFEXITED(stat_val)) {
fprintf(stdout, "Child terminated abnormaly\n");
}
exit(1);
}
free_dblist();
exit(0);
}
void malloc_dblist()
{
int i = 0;
//malloc for db_list
for (i = 0; i < NUM; i++) {
db_list[i] = malloc(LEN);
memset(db_list[i], '\0', LEN);
}
}
void free_dblist()
{
int i;
//free db_list's memory
for (i = 0; i < NUM; i++) {
free(db_list[i]);
}
}
void readDbFile()
{
FILE *fp;
fp = fopen(DB_FILE, "r");
if (!fp) {
fprintf(stderr, "%s not found\n", DB_FILE);
}
else {
malloc_dblist();
read_num = 0;
while (fscanf(fp, "%127[^\r\n]\n", db_list[read_num]) == 1) {
puts(db_list[read_num]);
read_num++;
}
fclose(fp);
}
}
2. db_list.txt
admin book
3.
#include<sys/types.h>
#include<sys/wait.h>
#include<ctype.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
//待備份的數(shù)據(jù)表文件(一個數(shù)據(jù)庫一行)
#define DB_FILE "./db_list"
//最多可以備份的數(shù)據(jù)庫數(shù)量
#define NUM 20
//一個數(shù)據(jù)庫名字的最長字符數(shù)
#define LEN 128
//保存從DB_FILE中讀取到的數(shù)據(jù)庫
char *db_list[NUM];
//從DB_FILE文件中讀取到的數(shù)據(jù)庫數(shù)量
int read_num;
//請求內存函數(shù)
void malloc_dblist();
//釋放內存函數(shù)
void free_dblist();
//讀取數(shù)據(jù)庫文件
void readDbFile();
int main(int argc, char *argv[]) {
pid_t pid;
int i;
char buf[LEN];
//從文件讀取數(shù)據(jù)庫信息
readDbFile();
pid = fork();
if (pid < 0) {
fprintf(stderr, "fork error\n");
exit(1);
}
switch (pid) {
case -1:
fprintf(stderr, "fork failed\n");
exit(1);
case 0:
//子進程進行數(shù)據(jù)庫的備份
for (i = 0; i < read_num; i++) {
memset(buf, '\0', LEN);
sprintf(buf, "%s%s%s%s%s", "mysqldump -uroot ", db_list[i], " > ", db_list[i], ".sql");
system(buf);
printf("%d,%s\n", i, buf);
}
break;
}
//等待子進程的結束
if (pid > 0) {
int stat_val;
pid_t child_pid;
child_pid = wait(&stat_val);
if (!WIFEXITED(stat_val)) {
fprintf(stdout, "Child terminated abnormaly\n");
}
exit(1);
}
free_dblist();
exit(0);
}
void malloc_dblist()
{
int i = 0;
//malloc for db_list
for (i = 0; i < NUM; i++) {
db_list[i] = malloc(LEN);
memset(db_list[i], '\0', LEN);
}
}
void free_dblist()
{
int i;
//free db_list's memory
for (i = 0; i < NUM; i++) {
free(db_list[i]);
}
}
void readDbFile()
{
FILE *fp;
fp = fopen(DB_FILE, "r");
if (!fp) {
fprintf(stderr, "%s not found\n", DB_FILE);
}
else {
malloc_dblist();
read_num = 0;
while (fscanf(fp, "%127[^\r\n]\n", db_list[read_num]) == 1) {
puts(db_list[read_num]);
read_num++;
}
fclose(fp);
}
}
以上所述就是本文的全部內容了,希望大家能夠喜歡。
相關文章
C++通過共享內存ShellCode實現(xiàn)跨進程傳輸
在計算機安全領域,ShellCode是一段用于利用系統(tǒng)漏洞或執(zhí)行特定任務的機器碼,本文主要為大家介紹了C++如何通過共享內存ShellCode實現(xiàn)跨進程傳輸,需要的可以參考下2023-12-12

