Linux kernel insmod printk不';不起作用,但对rmmod起作用

Linux kernel insmod printk不';不起作用,但对rmmod起作用,linux-kernel,linux-device-driver,centos7,Linux Kernel,Linux Device Driver,Centos7,由于我仍在学习内核模块编程,无法理解问题背后的原因。当我运行insmod hello.ko时,dmesg或/var/logs/message不显示/打印消息,而当我运行rmmod hello.ko时,dmesg或/var/logs/message显示/打印来自hello_init(void)和hello_exit(void)的字符串 #包括 #包括 模块许可证(“双BSD/GPL”); 静态int hello_init(void) { printk(KERN_ALERT“Hello World!

由于我仍在学习内核模块编程,无法理解问题背后的原因。当我运行
insmod hello.ko
时,
dmesg或/var/logs/message
不显示/打印消息,而当我运行
rmmod hello.ko
时,
dmesg或/var/logs/message
显示/打印来自
hello_init(void)和hello_exit(void)
的字符串

#包括
#包括
模块许可证(“双BSD/GPL”);
静态int hello_init(void)
{
printk(KERN_ALERT“Hello World!!”);
返回0;
}
静态void hello_退出(void)
{
printk(KERN_警报“再见世界!”);
}
模块_init(hello_init);
模块退出(你好退出);

printk
非常了解新行。
printk(KERN_警报“Hello World!!”)不打印任何内容,因为它没有换行符。它等待下一个
printk(KERN_CONT
作为该行的延续,等待下一个
prinkt(KERN_CONT
带有换行符)。它将在下一个
printk上打印(KERN_ALERT
,因为
printk
假设最后一行已经结束并打印。如果要立即输出,请在格式字符串中添加新行

所以只要:

  printk(KERN_ALERT "Hello World!!\n");

printk
非常了解新行。
printk(KERN\u ALERT“Hello World!!”)
没有新行,所以不打印任何内容。它等待下一个
printk(KERN\u CONT
作为该行的延续,下一个
prinkt(KERN\u CONT
带有新行)。它将在下一个
printk上打印(KERN_ALERT
,因为
printk
假设最后一行已经结束并打印。如果要立即输出,请在格式字符串中添加新行

所以只要:

  printk(KERN_ALERT "Hello World!!\n");

它的可能重复不是因为内核,而是由于
\n
对缓冲输出有特殊意义。它不是因为内核,而是由于
\n
对缓冲输出有特殊意义。