c语言 - 为什么 printk 不打印内核日志中的消息(dmesg)



我写了下面提到的小内核模块代码,我正在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 insertedn ");
    return 0;
}
void cleanup_mod_func(void)
{
    printk(KERN_INFO "My module removedn ");
}
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中n之后的space而发生的
但是我不明白为什么会这样。

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]

内核日志环形缓冲区的行为就像行缓冲区一样,正如在实现中所看到的:

  • vprintk_emit中,您可以看到它是如何根据尾部换行的存在来标记要刷新/缓冲的缓冲区的

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

很明显,您的消息不包含尾随换行符。如果删除了尾部空间,那么在printk调用中刷新消息之后,就会在内核日志中看到这些消息。

相关内容

  • 没有找到相关文章

最新更新