dmesg调试i信息常常作为判断系统异常退出的重要信息,但是当个系统异常退出或重启时,信息又难以保存下来,于是才有了将dmesg调试信息保存到文件中的想法:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
//#include <linux/autoconf.h>//内核编译的配置信息
#include <sys/klog.h>
#include <sys/stat.h>
//#define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)//在2.6.28内核中为默认1<<17,这才是真正dmesg buffer的大小,网上其他都扯淡。
#define __LOG_BUF_LEN (1 << 17)//在2.6.28内核中为默认1<<17,这才是真正dmesg buffer的大小,网上其他都扯淡。
#define __LOG_PATH "/home/default/dmesg.log"
#define LOG_SLEEP(x) (sleep(x))
#define __LOG_SIZE 10485760//大于10M时删除文件
#define BUF_SIZE 256
long check_log_size(void)
{
struct stat f_stat;
if( stat( __LOG_PATH, &f_stat ) == -1 )
{
return -1;
}
return (long)f_stat.st_size;
}
int main(int argc, char *argv[])
{
char buf[__LOG_BUF_LEN]={0,};
char tmpbuf[BUF_SIZE]={0,};
int ret = 0;
FILE *fp =NULL;
struct tm *ptr;
time_t lt;
//daemon(0,0);//进入守护模式
while(1)
{
LOG_SLEEP(120);//sleep 10 秒
fp = fopen(__LOG_PATH,"a+");//追加打开
if(NULL == fp)
{
printf("creat file faild !\n");
continue;
}
ret = klogctl(4,buf,__LOG_BUF_LEN);//获得dmesg信息,该函数需要超级用户权限运行
if(0 >= ret){
perror("klogctl ");
fclose(fp);
continue;
}
lt = time(NULL);//获得时间
ptr = (struct tm *)localtime(<);
sprintf(tmpbuf," [LOG TIME:] %s",asctime(ptr));//记录时间
printf("tmpbuf = %s\n",tmpbuf);
fwrite(tmpbuf,strlen(tmpbuf),1,fp);
fwrite(buf,strlen(buf),1,fp);
fflush(fp);
fclose(fp);
if(__LOG_SIZE < check_log_size())
{
unlink(__LOG_PATH);//删除该文件
}
memset(tmpbuf,0,BUF_SIZE);
memset(buf,0,__LOG_BUF_LEN);
}
return 0;
}
以下是Makefil
CC := arm-none-linux-gnueabi-gcc
all:dmesg_test
dmesg_test:dmesg_test.c
$(CC) dmesg_test.c -o dmesg_test -Wall
install:
cp dmesg_test /nfsroot/update
clean:
rm dmesg_test
运行:dmesg_test &
程序就进入后台执行了,每隔120秒会读取一次dmesg信息。