为什么printk不在内核日志中打印消息(dmesg)

时间:2016-08-08 06:32:53

标签: linux-kernel kernel kernel-module

我写了如下所述的小内核模块代码, 我正在ubuntu 14.04

进行测试
#include <linux/module.h> 
#include <linux/version.h>
#include <linux/kernel.h>
#include <linux/init.h>

int init_mod_func(void)
{
    printk(KERN_INFO "My module inserted\n ");
    return 0;
}

void cleanup_mod_func(void)
{
    printk(KERN_INFO "My module removed\n ");
}

module_init(init_mod_func);
module_exit(cleanup_mod_func);


MODULE_AUTHOR("Ankur");
MODULE_DESCRIPTION("TEST MODULE");
MODULE_LICENSE("GPL");

现在,当我使用insmod编译并插入上面的模块时,我在dmesg中看不到printk消息。但是在使用rmmod删除模块后,我会看到两个printk消息。

通过关闭外观,我发现由于printk中space之后的\n而发生这种情况。
但是我不明白为什么会这样。

ankur:~/temp/tmp$ 
ankur:~/temp/tmp$ 
ankur:~/temp/tmp$ sudo dmesg -C /dev/null
ankur:~/temp/tmp$ 
ankur:~/temp/tmp$ 
ankur:~/temp/tmp$ sudo insmod testmod.ko 
ankur:~/temp/tmp$ dmesg
ankur:~/temp/tmp$ 
ankur:~/temp/tmp$ sudo rmmod testmod
ankur:~/temp/tmp$ dmesg
[ 4062.140441] My module inserted
[ 4062.140441]  
[ 4073.324994] My module removed
[ 4073.324994]

1 个答案:

答案 0 :(得分:4)

内核日志环缓冲区的行为就像是行缓冲一样,因为它可以在实现中看到:

  • in vprintk_emit你可以看到它如何根据尾随换行符的存在来标记要刷新/缓冲的缓冲区

  • in log_output您可以看到负责刷新或缓冲消息的实际代码

很明显,您的邮件不包含尾随换行符。如果删除了尾随空格,您将在printk调用中刷新后在内核日志中看到这些消息。