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

📄 relog.cpp

📁 监控局域网上网
💻 CPP
字号:


#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <sys/msg.h>
#include <sys/socket.h>

#include <sys/errno.h>
#include <sys/signal.h>


#include <sys/wait.h>
#include <sys/types.h>
#include <sys/signal.h>
#include <sys/time.h>
#include <time.h>
#include <sys/stat.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <ctype.h>
#include <unistd.h>
#include <stdarg.h>
#include <fcntl.h>
#include <stdio.h>
#include <dirent.h>

void* safe_signal(int signo, void *func);
int getNow(char *stime);
int getSomeDay(char *stime, int days);

int read_logList_conf(char *fname);

typedef struct
{
	char  filename[128];
	int   maxsize;	
} logList_t;

logList_t  *gd_logList;
int        listLen;

int main(int argc, char **argv)
{
        int childpid;
        int i;
        int ret;
        int pid;
        int stau;
	struct stat fbuf;
	char fullname[256];
	char stime[16];
	char cmd[256];

	if (argc != 2)
	{
		printf("Usage:\n");
		printf("	relog  <日志列表配置文件>\n");
		exit(1);
	}

	ret = read_logList_conf(argv[1]);
	if (ret < 0) 	exit(1);
	
        if (fork() > 0) exit(0);

        safe_signal(SIGHUP, (void *)SIG_IGN);
        safe_signal(SIGINT, (void *)SIG_IGN);
        safe_signal(SIGPIPE, (void *)SIG_IGN);

	for (;;)
	{
		for (i=0; i<listLen; i++)
		{
		
			strcpy(fullname, gd_logList[i].filename);
			memset(&fbuf, 0, sizeof(struct stat));
			ret = stat(fullname, &fbuf);
			if (ret != 0)
			{
				printf("In stat fullname[%s], errno[%d:%s]\n", gd_logList[i].filename, errno, strerror(errno));
				continue;
			}
			if (fbuf.st_size > gd_logList[i].maxsize)
			{
				getNow(stime);
				sprintf(cmd, "cp %s %s.%s", fullname, fullname, stime);				
				system(cmd);

				getSomeDay(stime, -10);
				sprintf(cmd, "rm -f %s.%s", fullname, stime);				
				system(cmd);

				sprintf(cmd, "echo>%s", fullname);
				system(cmd);
			}
		}
		sleep(20);
	}
}


int ltrim(char *str)
{
	int len;

	len = strlen(str);
	if (len == 0) return 0;
	while (str[0] == ' ')
	{
		if (len == 1) 
		{
			str[0] = 0;
			break;
		}
		memcpy(str, &(str[1]), len-1);
		str[len-1] = 0;	
		len = strlen(str);
		if (len == 0) break;
	}	

	return 0;
}


int read_logList_conf(char *fname)
{
	int ret;
	int i;
	FILE *fp;
	char  aline[1024];
	char  field1[128];
	char  field2[128];


	fp = fopen(fname, "r");
	if (fp == NULL)
	{
printf("读取日志列表配置文件[%s]出错,错误[%d:%s]\n", fname, errno, strerror(errno));
		return -1;
	}

	i = 0;
	for (;;)
	{
		memset(aline, 0, sizeof(aline));
	 	fgets(aline, sizeof(aline)-1, fp);
		if ( feof(fp) ) break;
		strtok(aline, "");
		if (strlen(aline) == 0) continue;
		ltrim(aline);
		if (strlen(aline) == 0) continue;
		if (strcmp(aline, "\r") == 0) continue;
		if (strcmp(aline, "\n") == 0) continue;
		if (strcmp(aline, "\r\n") == 0) continue;		
		//若为注释
		if (aline[0] == '#') continue;
		memset(field1, 0, sizeof(field1));
		memset(field2, 0, sizeof(field2));
		sscanf(aline, "%s%s", field1, field2);
//printf("[%s]\n", field1);
		if (strlen(field1) > 127)
		{
			printf("[%s]超过127字符错误!\n", field1);
			return -1;	
		}	
		i ++;
	}
	rewind(fp);

	listLen = i;
	gd_logList = (logList_t *)calloc(sizeof(logList_t), i);

	i = 0;
	for (;;)
	{
		memset(aline, 0, sizeof(aline));
	 	fgets(aline, sizeof(aline)-1, fp);
		if ( feof(fp) ) break;
		strtok(aline, "");
		if (strlen(aline) == 0) continue;
		ltrim(aline);
		if (strlen(aline) == 0) continue;
		if (strcmp(aline, "\r") == 0) continue;
		if (strcmp(aline, "\n") == 0) continue;
		if (strcmp(aline, "\r\n") == 0) continue;		
		//若为注释
		if (aline[0] == '#') continue;
		memset(field1, 0, sizeof(field1));
		memset(field2, 0, sizeof(field2));
		sscanf(aline, "%s%s", field1, field2);
printf("[%s][%s]\n", field1, field2);
		strcpy(gd_logList[i].filename, field1);
		gd_logList[i].maxsize = atoi(field2);
		
		i ++;
		if (i == listLen) break;
	}

	fclose(fp);

	return 0;
}


void* safe_signal(int signo, void *func)
{
	struct sigaction act, oact;
	
	act.sa_handler = (void (*)(int))func;
	sigemptyset(&act.sa_mask);
	act.sa_flags = 0;
	if (signo == SIGALRM)
	{
#ifdef SA_INTERRUPT
		act.sa_flags |= SA_INTERRUPT;	/*sun os*/	
#endif
	}
	else
	{
#ifdef SA_RESTART
		act.sa_flags |= SA_RESTART;	/*svr4, 4.3+bsd*/
#endif 
	}
	
	if (sigaction(signo, &act, &oact) < 0)
		return (void *)(SIG_ERR);
	
	return (void *)(oact.sa_handler);
}

/*getNow--取得当前日期和时间
Argument:
	ascday--YYYYMMDD格式
	asctm--HHMMSS格式
*/
int getNow(char *stime)
{

	time_t 	t;
	struct tm 	* tm1;
	char ascday[9];
	char asctm[7];

	t = time(NULL);
	tm1 = localtime(&t);
	
        sprintf(ascday,"%04d",tm1->tm_year+1900);
        sprintf(ascday+4,"%02d",tm1->tm_mon+1);
        sprintf(ascday+6,"%02d",tm1->tm_mday);

        sprintf(asctm,"%02d",tm1->tm_hour);
        sprintf(asctm+2,"%02d",tm1->tm_min);

	sprintf(stime, "%s%s", ascday+4, asctm);

	return 0;
}



/*getNow--取得当前日期和时间
Argument:
	ascday--YYYYMMDD格式
	asctm--HHMMSS格式
*/
int getSomeDay(char *stime, int days)
{

	time_t 	t;
	struct tm 	* tm1;
	char ascday[9];
	char asctm[7];

	t = time(NULL);
	t += days*24*60*60;
	tm1 = localtime(&t);
	
        sprintf(ascday,"%04d",tm1->tm_year+1900);
        sprintf(ascday+4,"%02d",tm1->tm_mon+1);
        sprintf(ascday+6,"%02d",tm1->tm_mday);

        sprintf(asctm,"%02d",tm1->tm_hour);
        sprintf(asctm+2,"%02d",tm1->tm_min);

	sprintf(stime, "%s*", ascday+4);

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -