开发环境
- CentOS7.2.3/ SSH客户端SecureCRT
- MySQL 5.7 客户端Navicat Premium
- 编译器gcc、g++
- 字符集utf-8
上传项目源代码和开发框架
-
使用sftp从本地平台上传项目源代码project.tgz至服务器【SecureCRT7.2.3汉化补丁漏洞在显示时出现“??。?乱码问题”】
-
切换至root用户,在根目录下解压源代码压缩包
解压完成
-
将根目录下的project文件权限授权给普通用户
/project项目文件结构
开发永不停机的服务程序
原因:【程序的异常】
- 程序死掉或闪退是普遍现象,最好的解决方案是重启;
- 后台服务程序无人值守,没有界面
开发目标:
- 用守护进程监控服务程序的运行状态
- 如果服务程序发生故障,调度进程将重启服务程序
- 保证系统7x24小时不间断运行
生成测试数据
1.全国气象站点数据
查看
2.全国气象分钟观测数据
生成测试数据流程
1)搭建程序框架
- 创建idc2目录,进入再创建bin c ini sql四个子目录
拷贝站点参数文件
- 在c中写程序crtsurfdata1.cpp、构建自动化编译脚本makefile
3.1 定义项目需要的类和容器
struct st_stcode // 全国气象站点参数结构体。{
char provname[31]; // 省
char obtid[11]; // 站号
char obtname[31]; // 站名
double lat; // 纬度
double lon; // 经度
double height; // 海拔高度
};
vector<struct st_stcode> vstcode;// 存放全国气象站点参数的容器。
bool LoadSTCode(const char *inifile);// 把站点参数文件中加载到vstcode容器中。
CLogFile logfile; // 日志类。
3.2 在main中给出crtsurfdata1.cpp的输入样例,判断输入的合法性
if (argc!=4)
{ // 如果参数非法,给出帮助文档。 printf("Using:./crtsurfdata2 inifile outpath logfile\n");
printf("Example:/project/idc1/bin/crtsurfdata2 /project/idc1/ini/stcode.ini /tmp/surfdata /log/idc/crtsurfdata2.log\n\n");
printf("inifile 全国气象站点参数文件名。\n");
printf("outpath 全国气象站点数据文件存放的目录。\n");
printf("logfile 本程序运行的日志文件名。\n\n");
return -1;
}
3.3 把站点参数文件中加载到vstcode容器中。
if (logfile.Open(argv[3],"a+",false)==false)// 打开程序的日志文件。{
printf("logfile.Open(%s) failed.\n",argv[3]); return -1;
}
logfile.Write("crtsurfdata2 开始运行。\n");
if (LoadSTCode(argv[1])==false) return -1;// 把站点参数文件中加载到vstcode容器中。
logfile.WriteEx("crtsurfdata2 运行结束。\n");
- 测试crtsurfdata1.cpp ,使用CLogFile类进行日志操作相关事宜
2)加载站点参数
struct st_stcode // 全国气象站点参数结构体。{
char provname[31]; // 省
char obtid[11]; // 站号
char obtname[31]; // 站名
double lat; // 纬度
double lon; // 经度
double height; // 海拔高度};
定义LoadSTCode类把站点参数文件中加载到vstcode容器中。
bool LoadSTCode(const char *inifile)// 把站点参数文件中加载到vstcode容器中。{
CFile File;
if (File.Open(inifile,"r")==false)// 打开站点参数文件。 {
logfile.Write("File.Open(%s) failed.\n",inifile); return false;
}
char strBuffer[301];
CCmdStr CmdStr;
struct st_stcode stcode;
while (true)
{
if (File.Fgets(strBuffer,300,true)==false) break;// 从站点参数文件中读取一行,如果已读取完,跳出循环。
CmdStr.SplitToCmd(strBuffer,",",true);// 把读取到的一行拆分。
if (CmdStr.CmdCount()!=6) continue; // 扔掉无效的行。
memset(&stcode,0,sizeof(struct st_stcode));// 把站点参数的每个数据项保存到站点参数结构体中。
CmdStr.GetValue(0, stcode.provname,30); // 省
CmdStr.GetValue(1, stcode.obtid,10); // 站号
CmdStr.GetValue(2, stcode.obtname,30); // 站名
CmdStr.GetValue(3,&stcode.lat); // 纬度
CmdStr.GetValue(4,&stcode.lon); // 经度
CmdStr.GetValue(5,&stcode.height); // 海拔高度
vstcode.push_back(stcode);// 把站点参数结构体放入站点参数容器。
}
进行输出测试
添加输出测试语句
for (int ii=0;ii<vstcode.size();ii++)
logfile.Write("provname=%s,obtid=%s,obtname=%s,lat=%.2f,lon=%.2f,height=%.2f\n",\
vstcode[ii].provname,vstcode[ii].obtid,vstcode[ii].obtname,vstcode[ii].lat,\
vstcode[ii].lon,vstcode[ii].height);
可以在crtsurfdata2.log中查看