问题
I wrote small kernel module code as mentioned below,
I am testing it in 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");
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]
回答1:
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).
来源:https://stackoverflow.com/questions/38822599/why-printk-doesnt-print-message-in-kernel-logdmesg