⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 libcore.cpp

📁 液晶电视完整代码可实现人机界面
💻 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 + -