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

本文探讨了在Ubuntu 14.04上编写的一个小型内核模块,发现使用insmod加载模块时printk消息不会出现在dmesg中,但在使用rmmod卸载模块后会显示所有消息。问题在于printk中的换行符后有一个空格,导致消息未被立即刷新到内核日志。通过对vprintk_emit和log_output的分析,了解到内核日志缓冲区的行为类似于行缓冲,需要尾随换行符才能触发消息刷新。
摘要由CSDN通过智能技术生成

I wrote small kernel module code as mentioned below,

I am testing it in ubuntu 14.04

#include

#include

#include

#include

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");

Now when I compile and insert above module using insmod I don't see printk message in the dmesg. However after module removal using rmmod I see both the printk messages.

With closure look, I found out that it is happening because of space after \n in the printk.

However I don't get why it is like that.

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]

解决方案

The kernel log ring buffer behaves as if it were line-buffered, as it can be seen in the implementation:

in vprintk_emit you can see how it marks a buffer to be flushed/buffered based on the existence of a trailing newline

in log_output you can see the actual code which takes care of flushing or buffering the message

As it is evident, your messages do not contain trailing newlines. Had you deleted the trailing space, you would see the messages in the kernel log after they had been flushed in the printk call(s).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值