Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why printk doesn't print message in kernel log(dmesg)

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]
like image 789
ART Avatar asked Aug 08 '16 06:08

ART


1 Answers

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).

like image 87
Michael Foukarakis Avatar answered Oct 24 '22 09:10

Michael Foukarakis