//打开文件
fp = fopen("/mnt/sdcard/com.log", "at+");
if(fp == NULL){
perror("fopen:");
printf("fopen(/mnt/sdcard/com.log) err...\n");
}
//重定向文件
oldstdout = dup(STD_OUT);
dup2(fileno(fp) , STD_OUT);
oldstderr = dup(STD_ERR);
dup2(fileno(fp) , STD_ERR);
//限定日志文件大小,大于限定值清空文件重写
while(1)
{
int rc = ftell(fp);
if(rc < 0)
{
perror("ftell:");
}
if(rc > 10*1024)
{
//还原重定向
dup2(oldstdout, STD_OUT);
close(oldstdout);
dup2(oldstderr, STD_ERR);
close(oldstderr);
fclose(fp);
//重定位标准输出,错误输出到fp
fp = fopen("/mnt/sdcard/com.log", "wb+");
if(fp == NULL)
{
perror("fopen:");
printf("fopen(/mnt/sdcard/com.log) err...\n");
}
rc = fseek(fp, 0, SEEK_SET);
if(rc < 0)
{
perror("fseek:");
}
oldstdout = dup(STD_OUT);
//dup2(sock, STD_OUT);
dup2(fileno(fp) , STD_OUT);
oldstderr = dup(STD_ERR);
//dup2(sock, STD_ERR);
dup2(fileno(fp) , STD_ERR);
rc = lseek(STD_OUT, 0, SEEK_SET);
if(rc < 0)
{
perror("lseek:");
}
rc = lseek(STD_ERR, 0, SEEK_SET);
if(rc < 0)
{
perror("lseek:");
}
printf("\n\n############# reset file pos 0 ####################\n\n");
}
sleep(3);
}
该方案可用于设备日志系统,用于记录设备的运行情况,当设备出现异常后有完整的日志信息用于定位问题。