📄 libcore.cpp
字号:
#include "libcore.h"long onFilelock(int fd, int cmd, int type, off_t offset, int whence, off_t len){ struct flock lock; lock.l_type = type; lock.l_start = offset; lock.l_whence = whence; lock.l_len = len; return ( fcntl(fd, cmd, &lock) );}long holdFilelock(char *sed){ long fd = 0; long rc = 0; char buf[32]; fd = open(sed, O_RDWR|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP); rc = lockW(fd, 0, SEEK_SET, 0); if (rc < 0) { if (fd > 0) close(fd); if ((EACCES == errno) || (EAGAIN == errno)) { return ( 0 ); } else { return ( -1 ); } } snprintf(buf, sizeof(buf), "\t%d", getpid()); write(fd, buf, strlen(buf)); return ( fd );}long markFilelock(int fd){ char buf[32]; snprintf(buf, sizeof(buf), "\t%d", getpid()); write(fd, buf, strlen(buf)); return (long) 0;}///////////////////////////////////////////////////////////////////////////////void ssleep(long usec){ struct timeval timeout; ldiv_t d = ldiv(usec, 1000000L); timeout.tv_sec = d.quot; timeout.tv_usec = d.rem; select(0, NULL, NULL, NULL, &timeout);}long unholdFilelock(int fd){ write(fd, "\t", strlen("\t")); lockU(fd, 0, SEEK_SET, 0); close(fd); return (long) 0;}//***************************************************************************//* 描述://* 获得文件最后修改时间//* 参数://* <file> 文件名称//* 返回值://* <time_t> 绝对时间//* 错误码://***************************************************************************time_t getFileTime(char *file){ struct stat st; if (stat(file, &st) == -1) { return ( 0 ); } else { return ( st.st_ctime ); }}//***************************************************************************//* 描述://* 记录日志,目标文件为errlog。//* 参数://* <fmt> 。//* 返回值://* <-1> 打开文件失败。//* <-2> 写文件失败。//* 错误码://***************************************************************************int errlog(char * fmt, ...){ va_list ap; char fullname[128]; FILE * fp; int fd; struct timeval ct; struct tm ttm; struct timezone zone; /* 取时间 */ gettimeofday(&ct, &zone); localtime_r(&(ct.tv_sec), &ttm); if (ttm.tm_year >= 70) ttm.tm_year = ttm.tm_year + 1900; else ttm.tm_year = ttm.tm_year + 2000; ttm.tm_mon = ttm.tm_mon + 1; /* 打开文件 */ memset(fullname, 0, sizeof(fullname)); if (getenv("WORKDIR") != NULL) { snprintf(fullname, sizeof(fullname), "%s/log/errlog.%d", getenv("WORKDIR"), ttm.tm_wday); } else { snprintf(fullname, sizeof(fullname), "%s/errlog.%d", DEF_LOG_PATH, ttm.tm_wday); } if ((fp = fopen(fullname, "a+")) == NULL) { return (-1); } /* 为避免写入混乱将文件加锁 */ fd = fileno(fp); lockf(fd, F_LOCK, 0l); /* 写入文件 */ fprintf(fp, "[%02d%02d %02d:%02d:%02d.%03d]", ttm.tm_mon,ttm.tm_mday,ttm.tm_hour,ttm.tm_min,ttm.tm_sec,ct.tv_usec); va_start(ap, fmt); if (vfprintf(fp, fmt, ap) < 0) { fclose(fp); /* 关闭文件 */ return (-2); } va_end(ap); fprintf(fp, "\n"); /* 解锁 */ lockf(fd, F_ULOCK, 0l); fclose(fp); /* 关闭文件 */ return ( 0 );}//***************************************************************************//* 描述://* 记录日志。//* 参数://* <filename> 目标文件名称。//* <fmt> 。//* 返回值://* <-1> 打开文件失败。//* <-2> 写文件失败。//* 错误码://***************************************************************************/***int filelog(char * filename, char * fmt, ...){ char logBuffer[1024*1024]; memset(logBuffer, 0, 1024*1024); va_list argptr; va_start(argptr,fmt); vsprintf(logBuffer,fmt,argptr); va_end(argptr); printf("LOG:%s", logBuffer); return 1; va_list ap; char fullname[128]; char bakLogName[128]; FILE * fp; int fd; struct timeval ct; struct tm ttm; struct timezone zone; struct stat buf; int result; gettimeofday(&ct, &zone); localtime_r(&(ct.tv_sec), &ttm); if (ttm.tm_year >= 70) ttm.tm_year = ttm.tm_year + 1900; else ttm.tm_year = ttm.tm_year + 2000; ttm.tm_mon = ttm.tm_mon + 1; // 打开文件 // memset(fullname, 0, sizeof(fullname)); if (getenv("WORKDIR") != NULL) { snprintf(fullname, sizeof(fullname), "%s/log/%s", getenv("WORKDIR"), filename); } else { snprintf(fullname, sizeof(fullname), "%s/%s", DEF_LOG_PATH, filename); } if(0!=access(fullname, F_OK)) { fp = NULL; fp = fopen(fullname, "a+"); if(NULL == fp) { printf("Open file=[%s] failed\n"); return -1; } fprintf(fp, "Now begin write debug log\n"); fclose(fp); } //验证日志大小,超过10M则备份重新创建新的日志文件 memset(bakLogName, 0, 128); sprintf(bakLogName, "%04d%02d%02d%02d%02d-%s", ttm.tm_year, \ ttm.tm_mon, ttm.tm_mday, ttm.tm_hour, ttm.tm_min, filename); char bakLogFullName[128]; memset(bakLogFullName, 0, 128); sprintf(bakLogFullName, "%s/log/%s", getenv("WORKDIR"), bakLogName); result = stat( fullname, &buf ); if( result != 0 ) { printf("Stat %s failed\n", fullname); return -1; } if(buf.st_size > 1024*1024*10) { fclose(fp); if(!rename(fullname, bakLogFullName)) { printf("Rename [%s] to [%s] failed\n", fullname, bakLogFullName); return -1; } // char cmd[255]; char newfile[128]; memset(newfile, 0, 128); memset(cmd, 0, 255); sprintf(newfile, "%s/bak/%s", getenv("WORKDIR"), bakLogName); sprintf(cmd, "mv -f %s %s", bakLogFullName, newfile); printf("%s\n", cmd); system(cmd); // //创建新的日志文件 if ((fp = fopen(fullname, "a+")) == NULL) { return (-1); } fprintf(fp, "Now begin write debug log\n"); fclose(fp); } if ((fp = fopen(fullname, "a+")) == NULL) { return (-1); } // 为避免写入混乱将文件加锁 // fd = fileno(fp); lockf(fd, F_LOCK, 0l); fprintf(fp, "[%02d-%02d %02d:%02d:%02d]", ttm.tm_mon,ttm.tm_mday,ttm.tm_hour,ttm.tm_min,ttm.tm_sec); // 写入文件 // va_start(ap, fmt); char buff[64*1024+1]; memset(buff, 0, 64*1024+1); if(strlen(fmt)>= 2*1024) { strcpy(buff, "print content too log >= 2K"); //printf(buff); } else { memcpy(buff, fmt, strlen(fmt)); } if(buff[strlen(buff)-1] != '\n') { strcat(buff, "\n"); } if (vfprintf(fp, buff, ap) < 0) { fclose(fp); // 关闭文件 // return (-2); } va_end(ap); // 解锁 // lockf(fd, F_ULOCK, 0l); fclose(fp); // 关闭文件 // return ( 0 );}***//**************************************************************************** 描述:* 记录日志。* 参数:* <filename> 目标文件名称。* <fmt> 。* 返回值:* <-1> 打开文件失败。* <-2> 写文件失败。* 错误码:***************************************************************************/int filelog(char * filename, char * fmt, ...){ va_list ap; char fullname[128]; char fullpath[128]; FILE * fp; int fd; int ret; struct timeval ct; struct tm ttm; struct timezone zone; gettimeofday(&ct, &zone); localtime_r(&(ct.tv_sec), &ttm); if (ttm.tm_year >= 70) ttm.tm_year = ttm.tm_year + 1900; else ttm.tm_year = ttm.tm_year + 2000; ttm.tm_mon = ttm.tm_mon + 1; /* 打开文件 */ memset(fullname, 0, sizeof(fullname)); memset(fullpath, 0, sizeof(fullpath)); if (getenv("WORKDIR") != NULL) { snprintf(fullpath, sizeof(fullpath), "%s/log/%4d%02d%02d", getenv("WORKDIR"), ttm.tm_year,ttm.tm_mon,ttm.tm_mday); } else { snprintf(fullpath, sizeof(fullpath), "%s/%4d%02d%02d", "/home/cis/log", ttm.tm_year,ttm.tm_mon,ttm.tm_mday); } //验证目录 ret = access( fullpath, W_OK ); if( ret == -1 ) { //创建目录 ret = mkdir( fullpath, S_IRWXU ); if( ret != 0 ) { printf("mkdir error!!!!!!!!!!!!!\n"); return FALSE; } } sprintf(fullname, "%s/%s[%4d%02d%02d]", fullpath, filename, ttm.tm_year,ttm.tm_mon,ttm.tm_mday ); if ((fp = fopen(fullname, "a+")) == NULL) { return (-1); } /* 为避免写入混乱将文件加锁 */ fd = fileno(fp); lockf(fd, F_LOCK, 0l); fprintf(fp, "[%02d-%02d %02d:%02d:%02d]", ttm.tm_mon,ttm.tm_mday,ttm.tm_hour,ttm.tm_min,ttm.tm_sec); /* 写入文件 */ va_start(ap, fmt); if (vfprintf(fp, fmt, ap) < 0) { fclose(fp); /* 关闭文件 */ return (-2); } va_end(ap); /* 解锁 */ lockf(fd, F_ULOCK, 0l); fclose(fp); /* 关闭文件 */ return ( 0 );}//***************************************************************************//* 描述://* 创建工作进程。//* 参数://* 返回值://* <long> 进程号。//* 错误码://***************************************************************************int newProc(const char *cmd, const char *param){ pid_t pid; int i = 0; /* 初始化进程环境 */ if ((pid = fork()) == 0) {/* pid = initDaemon();*/ for(i=1; i<sysconf(_SC_OPEN_MAX); i++) close(i); execl(cmd, param, 0); exit( 0 ); } return ( pid );}//***************************************************************************//* 描述://* 将进程初始化为daemon进程。//* 参数://* 返回值://* <int> 进程号。//* 错误码://***************************************************************************int initDaemon(){ int i; pid_t childpid; char filepath[100]; signal(SIGCHLD, SIG_IGN); signal(SIGINT, SIG_IGN); memset( filepath, 0x0, sizeof(filepath) ); sprintf(filepath,"%s/data",getenv("WORKDIR")); childpid = fork(); if ( childpid != 0) { exit( 0 ); } setsid(); signal(SIGHUP, SIG_IGN); if ((childpid = fork()) != 0) exit( 0 ); chdir( filepath ); umask( 0 ); for(i=0; i<sysconf(_SC_OPEN_MAX); i++) close(i); return ( getpid() );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -