一个奇怪的问题
有windows XP和windows 2000
共一百多台机器,
是mon_log、dlog、wlog是程序里记录日志的函数。
目前的问题:间或有几台机器,日志文件出现大量乱码,程序崩溃。
好像访问了非法内存了或者内存溢出死掉了。
代码如下:
static int adjust_log(FILE *fp, char *logname)
{
char name[256];
char next[256]; //for example: name="mon2.log", so next="mon3.log"
int i;
#define GET_LOGNAME(name, num) sprintf(name, "%s.%d", logname, num)
GET_LOGNAME(name, LOG_FILE_NUM-1);
if(access(name, 0) == 0) {
GET_LOGNAME(name, LOG_FILE_NUM);
remove(name);
}
for(i = LOG_FILE_NUM-1; i > 0; i--) {
GET_LOGNAME(name, i);
if(access(name, 0) == 0) {
GET_LOGNAME(next, i+1);
rename(name, next);
}
}
GET_LOGNAME(next, 1);
CopyFile(LOG_FILE, next, FALSE);
chsize(fileno(fp), 0);
return 0;
}
#define MAX_LINE_SIZE 512
void write_log(FILE *fp, char *name, int type, char *msg)
{
time_t ltime;
struct tm *today;
#define TIME_STR_SIZE 64
char date_str[TIME_STR_SIZE] = {0};
char time_str[TIME_STR_SIZE] = {0};
int size;
char *typestr;
int rc;
time(<ime);
today = localtime(<ime);
switch(type) {
case INFO_TYPE:
typestr = "INF";
break;
case WARNING_TYPE:
typestr = "WAR";
break;
case ERROR_TYPE:
typestr = "ERR";
break;
case FATAL_TYPE:
typestr = "FAT";
break;
default:
return;
}
if (fp != NULL)
{
size = filelength(fileno(fp));
/* 文件大小超过10M,清空重新开始 */
if(size > LOG_FILE_MAX_SIZE) {
adjust_log(fp, name);
}
if (today != NULL) {
rc = sprintf(date_str,"%04d/%02d/%02d",today->tm_year+1900,today->tm_mon+1,today->tm_mday);
sprintf(time_str,"%02d:%02d:%02d",today->tm_hour,today->tm_min,today->tm_sec);
}
date_str[TIME_STR_SIZE - 1] = '\0';
time_str[TIME_STR_SIZE - 1] = '\0';
fprintf(fp, "%s %s(%s): ", date_str, time_str, typestr);
fprintf(fp, "%s", msg);
fprintf(fp,"\n");
fflush(fp);
}
return;
}
void dlog(int type, const char *format, ...)
{
va_list ap;
FILE *fp;
char msg[MAX_LINE_SIZE];
fp = fopen(LOG_FILE, "a+");
if(NULL == fp) {
return;
}
va_start(ap, format);
_vsnprintf(msg, sizeof(msg)-1, format, ap);
msg[MAX_LINE_SIZE-1] = '\0';
va_end(ap);
write_log(fp, LOG_FILE, type, msg);
fclose(fp);
return;
}
void wlog(char *name, int type, const char *format, ...)
{
va_list ap;
FILE *fp;
char msg[MAX_LINE_SIZE];
fp = fopen(name, "a+");
if (NULL == fp) {
return;
}
va_start(ap, format);
_vsnprintf(msg, sizeof(msg)-1, format, ap);
msg[MAX_LINE_SIZE-1] = '\0';
va_end(ap);
write_log(fp, name, type, msg);
fclose(fp);
return;
}
void mon_log (int type, const char *format, ...)
{
va_list ap;
static FILE *fp;
static HANDLE hMutex;
char msg[MAX_LINE_SIZE];
if(hMutex == NULL) {
hMutex = CreateMutex(NULL, FALSE, NULL);
if (hMutex == NULL) {
printf("CreateMutex error: %d\n", GetLastError());
return;
}
}
WaitForSingleObject(hMutex, INFINITE);
if(NULL == fp) {
fp = fopen(LOG_FILE, "a+");
}
va_start(ap, format);
_vsnprintf(msg, sizeof(msg)-1, format, ap);
msg[MAX_LINE_SIZE-1] = '\0';
va_end(ap);
write_log(fp, LOG_FILE, type, msg);
ReleaseMutex(hMutex);
return;
}
相关推荐
一个奇怪的问题使用ajax提交必须alert才能赋值
一个奇怪的问题,在使用ajax提交的时候将返回值赋给一个变量,无论怎么写都没法赋值,刚开始怀疑js有错但是ie没有反应过来,多次清缓存、部程序都没效果。。。。。。最后只好一行一行的alert看原因出在哪里;奇怪的是加上了alert之后就可以赋值,删掉alert后就又不可以了。百度了一下发现是因为ajax默认是异步执行的,也就是并没有等待请求完毕就开始执行下一行js语句了,导致赋值为null。 如果遇到ajax请求后有回调函数之类的问题就要加上async:false,注意如果是给false加上引号是没发解决问题的。 代码如下: $.ajax({ async:false })
一年级语文下册 一个奇怪的问题1教案 沪教版 教案.doc
一年级语文下册 一个奇怪的问题1教案 沪教版 教案.doc
一个奇怪的问题ppt(沪教版)PPT课件.ppt
一个奇怪的问题ppt(沪教版)PPT课件.ppt
在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题
样的脚本你在ie8下调用,在ie8地址栏下按下回车后调用jquery的对像、方法什么的没有问题,但是刷新之后就有问题。就是刷新之后无论怎样你要在地址栏按一下回车。
spcomm控件,解决一个超奇怪的串口通讯问题,使用SPCOMM,第一次总是通讯不了
现在这个奇怪的现象是这样的,我用delphi7加SPCOMM2.5开发串口通讯程序,有点象网上一些通讯小精灵之类的,主要是跟智能仪表这些设备进行采集,奇怪的是,很多时候都会出现这样的情况,第一次,运行我自己的程序,发送指令,好像com口那里都没有发出去似的,仪表没有响应,这时,我用网上下载的其他工具,发送同样的命令,可以通了,之后,又换回去我的程序,这时候,我自己做的程序就可以通讯了,我试过很多次都是这样,不知道为什么啊?感觉就好像要激活一下这样的,不知大家有没有遇到过这样情况呢,好奇怪,百思不得其解,还请各位指教指教。 我在做串口的时候也出现这个现象,搜索的时候发现了这个帖子,但是帖子中的方法都测试了还是没有解决。于是我查找各种资料,追踪程序。最后终于解决了这个问题。 解决问题的方法很简单,简单到不可思议,但是是花了很长很长时间解决这个问题的。 我把修改后的pas,发上来。


