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

转载 2015年07月10日 10:55:49
有的时候调试内核程序,经常要将信息打印到其他地方如指定文件或终端还有网络,  网络的话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上测试过了

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

有的时候调试内核程序,经常要将信息打印到其他地方如指定文件或终端还有网络,  网络的话dreanice版主写过个netconsole我这里就不说了... 打印到文件:     ...
  • yyp872
  • yyp872
  • 2013年06月06日 20:59
  • 1121

linux下关闭printk打印信息以及通过网络查看方法

我们在linux底层驱动或者kernel中调用的printk函数其作用是将printk的内容输出到控制台,但printk实质是将需要输出的内容写入底层环形输出数据缓冲区,linux根据控制将数据输出到...

printk打印不能显示到终端的解决方法

printk与printf有个不同的地方,就是printk有打印级别 使用printk时,Linux内核根据日志级别,可能把消息打印到当前控制台上,这个控制台是一个字符设备。这些消息从终端输出的前提是...

printk打印不能显示到终端的问题

printk打印不能显示到终端的问题 2011-05-19 16:01:43 分类: LINUX  printk   对于做嵌入式或者熟悉linu...

printk打印终端无法显示

printk   对于做嵌入式或者熟悉linux内核的人来说,对printk这个函数一定不会感到陌生。printk相当于printf的孪生姐妹,她们一个运行在用户态,另一个则在内核态被人们所...

printk打印不能显示到终端的问题 ---fwqlzz love is for ever

对于做嵌入式或者熟悉linux内核的人来说,对printk这个函数一定不会感到陌生。printk相当于printf的孪生姐妹,她们一个运行在用户态,另一个则在内核态被人们所熟知。   【原型】  ...
  • fwqlzz
  • fwqlzz
  • 2016年04月15日 01:03
  • 287

调整内核printk打印级别--减少启动时的打印信息

有时调试内核模块,打印信息太多了,可以通过修改/proc/sys/kernel/printk文件内容来控制。默认设置是6   4   1   7 # cat /proc/sys/kernel/p...

要将linux内核的带级别控制的printk内容打印出来,在命令行 输入 dmesg -n 8 就将所有级别的信息都打印出来

要将linux内核的带级别控制的printk内容打印出来,在命令行 输入 dmesg -n 8 就将所有级别的信息都打印出来   Linux命令:dmesg  功能说明:显示开机信息。 ...

三 printk如何打印信息

printk的定义 可变参数 参考va_list,va_start,va_arg,va_end可变参数 asmlinkage int printk(const char *fmt, ...) {...
  • paomadi
  • paomadi
  • 2013年01月29日 23:24
  • 1909

用函数printk打印内核信息的方法

Linux内核用函数printk打印调试信息,该函数的用法与C库打印函数printf格式类似,但在内核使用。用户可在内核代码中的某位置加入函数printk,直接把所关心的信息打打印到屏幕上或日志文件中...
  • emalwb
  • emalwb
  • 2014年02月27日 13:30
  • 1033
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:模块中printk信息打印到指定文件 终端 网络
举报原因:
原因补充:

(最多只允许输入30个字)