linux数据存储与超量删除

  • y9_984831
    了解作者
  • 13.8KB
    文件大小
  • gz
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-06-10 04:08
    上传日期
linux简单应用文件读写,定时100ms存储文件(时间间隔根据自己需求自己改),存储数据,当磁盘空间小于一定值时,删除最靠前数据。
linux_log定时存储与删除.gz
  • app_storage
  • tbox_storage_interface.c
    16KB
  • tbox_storage_interface.h
    84B
  • mytest
    19KB
  • tbox_storage_interface.o
    10.6KB
  • Makefile
    266B
内容介绍
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <stdint.h> #include <string.h> #include <time.h> #include <fcntl.h>// file sys #include <sys/stat.h> #include <sys/types.h> #include <sys/time.h> //settimer #include <signal.h> //settimer SIGALRM #include <sys/vfs.h> //文件系统 #include <dirent.h> // dir #include <pthread.h> #include "tbox_storage_interface.h" #define Gsize (1024.00*1024.00*1024.00) #define Msize (1024.00*1024.00) #ifndef EXT_X_SUPER_MAGIC #define EXT_X_SUPER_MAGIC 0xef53 #endif #define MAX_BFREE_GB 7 #define LOAD "/home/userone/gxlife/datalog-for-load" #define LIST_MAX 1024 #define FILE_NAME_MAX 16 static uint8_t current_work_list[LIST_MAX]; static uint8_t mday[12]; static uint8_t mtime[12]; struct TimerType{ uint32_t year; //年 uint32_t mon; //月 uint32_t day; //日 uint32_t hour; //时 uint32_t min; //分 uint32_t sec; //秒 }; struct TimerType current_time;//当前时间 struct TimerType work_time;//记录切换工作路径时的时间 /**/ static struct itimerval new_value;//100ms定时器 static struct itimerval old_value;//100ms定时器 /**/ static int bRun=0;//标记当前程序运行状态 static void SIGINTSignalHandler( int nSignal ) { bRun = 0; } /************************************************** *功能:组成完整工作路径 *参数 输入/输出 类型 * out uint8_t *work_list 当前工作根目录 * in uint8_t *file_day 年月日描述字符串 * in uint8_t *file_time 时间字符串 *返回值:文件名字字符串长度 ***************************************************/ static uint32_t GetCurrentWorkList(uint8_t *work_list,const uint8_t *file_day,const uint8_t *file_time) { sprintf(work_list, "%s/%s/%s/", LOAD, file_day,file_time); return strlen(work_list); } /************************************************** *功能:获取时间 *参数 输入/输出 类型 * out struct TimerType *mytimerp 时间结构信息 *返回值:成功返回0 ***************************************************/ static uint8_t GetTime(struct TimerType *mytimerp) { time_t timep; struct tm *p; time(&timep); p=localtime(&timep); mytimerp->year= p->tm_year; mytimerp->mon = 1+p->tm_mon; mytimerp->day = p->tm_mday; mytimerp->hour= p->tm_hour; mytimerp->min = p->tm_min; mytimerp->sec = p->tm_sec; return 0; } /************************************************** *功能:获取时间—字符串存储方式 *参数 输入/输出 类型 * out uint8_t *mday 当前年月日字符串 * out uint8_t *mtime 当前时分秒字符串 *返回值:成功返回0 ***************************************************/ static uint8_t GetTimeChar(uint8_t *mday,uint8_t *mtime) { time_t timep; struct tm *p; time(&timep); p=localtime(&timep); memset(mday, 0, sizeof(mday)); memset(mtime,0, sizeof(mtime)); //printf("%d-%d-%d " ,(1900+p->tm_year),( 1+p->tm_mon), p->tm_mday); //printf("%d-%d-%d\n",p->tm_hour, p->tm_min, p->tm_sec); sprintf(mday, "%d-%d-%d", (1900+p->tm_year),( 1+p->tm_mon), p->tm_mday); sprintf(mtime,"%d-%d-%d", p->tm_hour, p->tm_min, p->tm_sec); //printf("mday: %s \n",mday); //printf("mtime: %s \n",mtime); return 0; } /************************************************** *功能:创建工作目录 *参数 输入/输出 类型 * in const uint8_t *sPathName 目录字符串 *返回值:成功返回0 ***************************************************/ static uint8_t CreateDir1(const uint8_t *sPathName) { uint8_t DirName[LIST_MAX]; strcpy(DirName, sPathName); uint32_t i,len = strlen(DirName); for(i=1; i<len; i++) { if(DirName[i]=='/') { DirName[i] = 0; if(access(DirName, NULL)!=0) { if(mkdir(DirName, 0755)==-1) { printf("mkdir error\n"); return -1; } } DirName[i] = '/'; } } return 0; } #if 0 // 备用函数 static uint8_t CreateDir2(const uint8_t *file_day,const uint8_t *file_time) { uint8_t DirName[LIST_MAX]; sprintf(DirName,"%s/%s/%s/", LOAD, file_day,file_time); uint32_t i,len = strlen(DirName); for(i=1; i<len; i++) { if(DirName[i]=='/') { DirName[i] = 0; if(access(DirName, NULL)!=0) { if(mkdir(DirName, 0755)==-1) { printf("mkdir error\n"); return -1; } } DirName[i] = '/'; } } return 0; } static uint8_t WriteCanData(const uint8_t *work_list,const uint8_t *CAN_ID,uint8_t rate,const uint8_t *CAN_Data) { uint8_t filename[FILE_NAME_MAX]; uint8_t filelist[LIST_MAX]; uint8_t data[64]; memset(data, 0, sizeof(data)); memcpy(data,CAN_Data,8); sprintf(data,"%x%x%x%x%x%x%x%x\n", CAN_Data[0], CAN_Data[1],CAN_Data[2],CAN_Data[3],CAN_Data[4],CAN_Data[5],CAN_Data[6],CAN_Data[7]); sprintf(filelist,"%s%d%d-%d.txt", work_list, CAN_ID[0],CAN_ID[1],rate); //printf("%s\n" ,filelist); //printf(data); int myfile =0; myfile=open(filelist,O_RDWR|O_CREAT|O_APPEND); write(myfile,data,strlen(data)); close(myfile); return 0; } // 备用函数 #endif /************************************************** *功能:CAN帧数据存储 *参数 输入/输出 类型 * in const uint8_t *work_list,const 存储绝对路径 * in const uint8_t *CAN_ID 指针,指向can帧ID * in uint8_t rate can的频率 * in const uint8_t *CAN_Data 指针,指向can帧数据(要存储内容) *返回值:成功返回0 ***************************************************/ static uint8_t WriteCanData_IO(const uint8_t *work_list,const uint8_t *CAN_ID,uint8_t rate,const uint8_t *CAN_Data) { uint8_t filename[FILE_NAME_MAX]; uint8_t filelist[LIST_MAX]; uint8_t data[64]; memset(data, 0, sizeof(data)); memcpy(data,CAN_Data,8); sprintf(data,"%x%x%x%x%x%x%x%x\n", CAN_Data[0], CAN_Data[1],CAN_Data[2],CAN_Data[3],CAN_Data[4],CAN_Data[5],CAN_Data[6],CAN_Data[7]); sprintf(filelist,"%s%d%d-%d.txt", work_list, CAN_ID[0],CAN_ID[1],rate); //printf("%s\n" ,filelist); FILE *myfile;//建立一个文件操作指针 myfile = fopen (filelist, "a"); fwrite(data,1,strlen(data),myfile); fclose(myfile); return 0; } /************************************************** *功能:根据当前时间,更新工作目录 *参数 输入/输出 类型 * 无 *返回值:无 ***************************************************/ extern void UpData_List(void) { GetTime(&work_time); GetTimeChar(mday,mtime); GetCurrentWorkList(current_work_list,mday,mtime); printf("%s\n" ,current_work_list); CreateDir1(current_work_list); } #if 1 // 虚拟数据来源 正式版去掉 uint32_t CANLen; uint8_t CANdata[200][10]; // 虚拟数据来源 正式版去掉 #endif /************************************************** *功能:数据存储主逻辑函数---放置循环中 *参数 输入/输出 类型 * 无 *返回值:无 ***************************************************/ static void Log_Fun(void) { int i=0,j=0;; uint8_t *mydata; #if 0 //判断一小时更新一次目录 正式版存储 GetTime(&current_time); int dis_min = (current_time.hour-work_time.hour)*60+(current_time.min-work_time.min); if(dis_min>=60){ UpData_List(); } #endif #if 1 // text 测试使用 GetTime(&current_time); int dis_sec = (current_time.min-work_time.min)*60+(current_time.sec-work_time.sec); if(dis_sec>=60){ UpData_List(); } memset(CANdata, 0, sizeof(CANdata)); CANLen=100; for(i=0;i<CANLen;i++){ for(j=0;j<10;j++){ CANdata[i][j]=i+j; } } // text 测试使用 #endif // 写入数据 for(i=0;i<CANLen;i++){ mydata = CANdata[i]; WriteCanData_IO(current_work_list,mydata,100,mydata+2); } } /********
评论
    相关推荐