您的位置:首页 > 其它

dmesg打印信息如何后台保存到文件中

2014-10-11 15:11 561 查看
dmesg调试i信息常常作为判断系统异常退出的重要信息,但是当个系统异常退出或重启时,信息又难以保存下来,于是才有了将dmesg调试信息保存到文件中的想法:

[cpp] view
plaincopy

#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

[cpp] view
plaincopy

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信息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: