修复日志处理,优化磁盘io,优化退出流程

This commit is contained in:
2026-01-29 12:10:36 +08:00
parent 65115e1a74
commit ee596a654d
10 changed files with 183 additions and 51 deletions

View File

@ -11,18 +11,22 @@
int in_log(logs *log,log_manager *self)
{
if(log == NULL||self == NULL)
return -1;
log->log[MAX_LOG_LENGTH-1] = '\0';
sem_wait(&self->log_sem);//加锁
logs *buf = self->rear;
if(self->log == NULL){
self->log = log;
self->rear = log;
self->count++;
sem_post(&self->log_sem);
return 0;
return self->count;
}
if(self->count == 1)
self->log->next = log;
self->count++;
buf->next = log;
log->next = NULL;
self->rear->next = log;
self->rear = log;
sem_post(&self->log_sem);
return self->count;
@ -30,15 +34,19 @@ int in_log(logs *log,log_manager *self)
logs *out_log(log_manager *self)
{
if(self == NULL)
return NULL;
sem_wait(&self->log_sem);
logs *buf = self->log;
if(self->log==NULL)
if(buf==NULL)
{
sem_post(&self->log_sem);
return NULL;
}
if(self->log->next ==NULL)
self->log = self->rear = NULL;
else
self->log = self->log->next;
self->count--;
sem_post(&self->log_sem);
buf->next =NULL;
@ -90,28 +98,105 @@ int cleanup(log_manager *self)
sem_post(&self->log_sem);
//释放信号量
int fd = open("log.txt",O_CREAT | O_WRONLY | O_APPEND, 0777);
char *logbuf;
void *logbufbk;
char failback[MAX_LOG_LENGTH];
logbuf = (char*)malloc(1);
logbuf[0] = '\0';
size_t buf_length,buf_lengthbk = 0;
while(loc->next !=NULL)
{
tobeclean = loc;
loc = loc->next;
if(fd == -1)
perror("file:");
write(fd,tobeclean->log,strlen(tobeclean->log));
if(logbuf != failback){
logbufbk = logbuf;
logbuf = (char*)realloc(logbuf,strlen(logbuf)+strlen(tobeclean->log)+1);//为日志分配新的内存
}
if(logbuf == NULL){
free(logbufbk);
logbuf = failback;//降级策略,堆空间不足时,使用预分配栈空间,保留最后一条日志
}
if(logbuf != failback){
buf_lengthbk = buf_length;
buf_length = strlen(logbuf)+strlen(tobeclean->log);
strcpy(logbuf+buf_lengthbk,tobeclean->log);
}
else
{
buf_length = MAX_LOG_LENGTH;
}
free(tobeclean);
}
close(fd);
int fd = open("log.txt",O_CREAT | O_WRONLY | O_APPEND, 0644);
if(fd == -1){
perror("file:");
free(loc);
if(logbuf != failback)
free(logbuf);
return -1;
}
if(logbuf != failback){
logbufbk = logbuf;
logbuf = (char*)realloc(logbuf,strlen(logbuf)+strlen(loc->log)+2);
if(logbuf == NULL)
{
free(logbufbk);
logbuf = failback;
strcpy(logbuf,loc->log);
buf_length = strlen(loc->log);
}
else{
buf_lengthbk = buf_length;
buf_length = strlen(logbuf)+strlen(loc->log);
strcpy(logbuf+buf_lengthbk,loc->log);
}
}
else{
strcpy(logbuf,loc->log);
buf_length = strlen(logbuf);
}
if(logbuf == failback&&buf_length>MAX_LOG_LENGTH)
logbuf[MAX_LOG_LENGTH-1] = '\0';
else{
logbuf[buf_length] = '\0';
}
free(loc);
int error_buf = write(fd,logbuf,strlen(logbuf));
if(error_buf==-1){
close(fd);
if(logbuf != failback)
free(logbuf);
return -1;
}
else if(error_buf<buf_length)
write(fd,"unknown error case log write cut down\n",38);
if(logbuf != failback)
free(logbuf);
close(fd);
return 0;
}
void log_manager_stop(log_manager *self)
{
pthread_mutex_lock(&self->mtx);
self->stop = 1; /* 置退出标志 */
pthread_cond_broadcast(&self->cond); /* 唤醒所有等待线程 */
if(self->stop == 1){
pthread_mutex_unlock(&self->mtx);
return ;
}
self->stop = 1;
/* 置退出标志 */
printf("SYS:stopping loger\n");
pthread_mutex_unlock(&self->mtx);
logs *log = malloc(sizeof(logs));
strcpy(log->log,"SYS:stopping loger\n");
self->in_log(log,self);
log = malloc(sizeof(logs));
strcpy(log->log,"SYS:done\n");
printf("SYS:done\n");
self->in_log(log,self);
pthread_mutex_unlock(&self->mtx);
pthread_cond_broadcast(&self->cond); /* 唤醒所有等待线程 */
}
//定期清理函数
@ -122,7 +207,7 @@ void *clear_log(void *self_p)
{
sleep_with_signal(self);
sem_wait(&self->log_sem);
if((self->count<256||self->log==NULL)&&self->stop !=1){
if((self->count<MAX_LOG||self->log==NULL)&&self->stop !=1){
sem_post(&self->log_sem);
continue;
}
@ -141,9 +226,28 @@ int init_loger(log_manager *self)
perror("NULL\n");
return -1;
}
sem_init(&self->log_sem, 0,1);
pthread_mutex_init(&self->mtx,NULL);
pthread_cond_init(&self->cond,NULL);
if(sem_init(&self->log_sem, 0,1)==-1)
return -1;
if(pthread_mutex_init(&self->mtx,NULL)==-1)
{
if(sem_destroy(&self->log_sem)==-1)
{
perror("log:");
}
return -1;
}
if(pthread_cond_init(&self->cond,NULL)==-1)
{
if(sem_destroy(&self->log_sem)==-1)
{
perror("log:");
}
if(pthread_mutex_destroy(&self->mtx)==-1)
{
perror("log:");
}
return -1;
}
self->in_log = in_log;
self->out_log = out_log;
self->clear_log = clear_log;
@ -151,4 +255,5 @@ int init_loger(log_manager *self)
self->stop = 0;
self->cleanup = cleanup;
self->count = 0;
return 0;
}

View File

@ -8,12 +8,13 @@
typedef struct logs
{
char log[4096];
char log[MAX_LOG_LENGTH];
struct logs *next;
}logs;
typedef struct log_manager
{
pthread_t pid;
int (*in_log)(logs *,struct log_manager*);
logs* (*out_log)(struct log_manager*);
void *(*clear_log)(void*);

View File

@ -72,8 +72,14 @@ void quit_all(int status,void *self_p)
free(resouce->tem->command);
}
//释放终端资源
//释放日志管理器
if(resouce->loger->pid != -1){
log_manager_stop(resouce->loger);
pthread_join(resouce->loger->pid,NULL);
}
pthread_mutex_destroy(&resouce->loger->mtx);
resouce->loger->cleanup(resouce->loger);
pthread_cond_destroy(&resouce->loger->cond);
log_manager_stop(resouce->loger);
sem_destroy(&resouce->loger->log_sem);
//销毁信号量