您的位置:首页 > 理论基础 > 计算机网络

模块中printk信息打印到指定文件 终端 网络

2015-07-10 10:55 696 查看
有的时候调试内核程序,经常要将信息打印到其他地方如指定文件或终端还有网络, 网络的话dreanice版主写过个netconsole我这里就不说了...

1、打印到文件:

#include <linux/kernel.h>

#include <linux/module.h>

#include <linux/init.h>

#include <linux/fs.h>

#include <linux/string.h>

#include <linux/mm.h>

#include <linux/syscalls.h>

#include <asm/unistd.h>

#include <asm/uaccess.h>

#define MY_FILE "/root/LogFile"

char buf[128];

struct file *file = NULL;

static int __init init(void)

{

mm_segment_t old_fs;

printk("Hello, I'm the module that intends to write messages to file.\n");

if(file == NULL)

file = filp_open(MY_FILE, O_RDWR | O_APPEND | O_CREAT, 0644);

if (IS_ERR(file)) {

printk("error occured while opening file %s, exiting...\n", MY_FILE);

return 0;

}

sprintf(buf,"%s", "The Messages.");

old_fs = get_fs();

set_fs(KERNEL_DS);

file->f_op->write(file, (char *)buf, sizeof(buf), &file->f_pos);

set_fs(old_fs);

return 0;

}

static void __exit fini(void)

{

if(file != NULL)

filp_close(file, NULL);

}

module_init(init);

module_exit(fini);

MODULE_LICENSE("GPL");

2、打印到终端:

#include <linux/kernel.h>

#include <linux/module.h>

#include <linux/init.h>

#include <linux/sched.h>

#include <linux/tty.h>

MODULE_LICENSE("GPL");

MODULE_AUTHOR("mq110");

static void print_string(char *str)

{

struct tty_struct *my_tty;

my_tty = current->signal->tty;

if (my_tty != NULL)

{

my_tty->driver->write(my_tty,str,strlen(str));

my_tty->driver->write(my_tty,"\015\013",2);

}

}

static int __init print_string_init(void)

{

print_string("Hello world!");

return 0;

}

static void __exit print_string_exit(void)

{

print_string("Goodbye world!");

}

module_init(print_string_init);

module_exit(print_string_exit);

3.修改一下/etc/syslog.conf 文件

#kern.* /dev/console

你打印的东西可能是某个级别的信息。比如说debug,这用printk 可以控制 。

那么就写程

kern.debug /var/log/kern_debug.log

-------------------------

printk(KERN_ALERT "Hello, world\n");

对应

/etc/syslog.conf 中的

kern.alert /kernel.txt

实验成功,修改后要执行

server syslogd restart 重启日志服务。

此方法等于用日志服务帮你做这个事情。该信息用

dmesg 命令也可以看到。

代码在Centos5.3 2.6.18上测试过了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: