Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 模块编程中printk日志级别的使用_Linux_Linux Kernel_Linux Device Driver_Printk - Fatal编程技术网

Linux 模块编程中printk日志级别的使用

Linux 模块编程中printk日志级别的使用,linux,linux-kernel,linux-device-driver,printk,Linux,Linux Kernel,Linux Device Driver,Printk,在这本书的printk部分中,作者说我们可以为我们的消息提供日志级别/优先级。但是我尝试了一个简单的模块程序,它有不同的printk日志级别,但是它显示了我在程序中写入printk消息的相同顺序,为什么它不按照优先级打印呢 #include<linux/module.h> #include<linux/kernel.h> static __init int log_init(void) { printk(KERN_INFO"insi

在这本书的
printk
部分中,作者说我们可以为我们的消息提供日志级别/优先级。但是我尝试了一个简单的模块程序,它有不同的printk日志级别,但是它显示了我在程序中写入printk消息的相同顺序,为什么它不按照优先级打印呢

  #include<linux/module.h>
  #include<linux/kernel.h>
  static __init int log_init(void)
     {
         printk(KERN_INFO"inside init 4 \n");
         printk(KERN_ERR"inside init 3\n");
         printk(KERN_CRIT"inside init 2\n");

         return 0;
     }
  static __exit void log_exit(void)
    {
        printk("inside exit\n");
    }
  module_init(log_init);
  module_exit(log_exit);

  MODULE_LICENSE("GPL");
我在这里复制了代码

  #include<linux/module.h>
  #include<linux/kernel.h>
  static __init int log_init(void)
     {
         printk(KERN_INFO"inside init 4 \n");
         printk(KERN_ERR"inside init 3\n");
         printk(KERN_CRIT"inside init 2\n");

         return 0;
     }
  static __exit void log_exit(void)
    {
        printk("inside exit\n");
    }
  module_init(log_init);
  module_exit(log_exit);

  MODULE_LICENSE("GPL");
那么我怎样才能按优先级打印它呢

  #include<linux/module.h>
  #include<linux/kernel.h>
  static __init int log_init(void)
     {
         printk(KERN_INFO"inside init 4 \n");
         printk(KERN_ERR"inside init 3\n");
         printk(KERN_CRIT"inside init 2\n");

         return 0;
     }
  static __exit void log_exit(void)
    {
        printk("inside exit\n");
    }
  module_init(log_init);
  module_exit(log_exit);

  MODULE_LICENSE("GPL");
init 2
init 3
init 4

您混淆了
printk
优先级的目的。他们不是要改变执行顺序,因为你在这里希望

  #include<linux/module.h>
  #include<linux/kernel.h>
  static __init int log_init(void)
     {
         printk(KERN_INFO"inside init 4 \n");
         printk(KERN_ERR"inside init 3\n");
         printk(KERN_CRIT"inside init 2\n");

         return 0;
     }
  static __exit void log_exit(void)
    {
        printk("inside exit\n");
    }
  module_init(log_init);
  module_exit(log_exit);

  MODULE_LICENSE("GPL");
通过为不同的内核消息分配不同的优先级,我们可以通过内核命令行指定适当的
loglevel
值来过滤控制台上显示的所需消息。例如,在linux内核中。有许多具有
KERN_DEBUG
优先级的消息。这些只是普通的调试消息。因此,如果您将
loglevel
启用到最大值7,那么您将在控制台上看到大量消息!!您的重要错误和警告将隐藏在这一连串的正常调试消息中

  #include<linux/module.h>
  #include<linux/kernel.h>
  static __init int log_init(void)
     {
         printk(KERN_INFO"inside init 4 \n");
         printk(KERN_ERR"inside init 3\n");
         printk(KERN_CRIT"inside init 2\n");

         return 0;
     }
  static __exit void log_exit(void)
    {
        printk("inside exit\n");
    }
  module_init(log_init);
  module_exit(log_exit);

  MODULE_LICENSE("GPL");
因此,在调试严重问题时,可以将
loglevel
指定为较低的值,以便控制台上只显示关键错误和警告

  #include<linux/module.h>
  #include<linux/kernel.h>
  static __init int log_init(void)
     {
         printk(KERN_INFO"inside init 4 \n");
         printk(KERN_ERR"inside init 3\n");
         printk(KERN_CRIT"inside init 2\n");

         return 0;
     }
  static __exit void log_exit(void)
    {
        printk("inside exit\n");
    }
  module_init(log_init);
  module_exit(log_exit);

  MODULE_LICENSE("GPL");

注意:无论
日志级别如何
,所有
printk
消息都存储在内核缓冲区中。优先级决定哪一个进入控制台。

另外:您可以通过将日志级别写入
/proc/sys/kernel/printk
,动态更改日志级别,例如
echo 3>/proc/sys/kernel/printk
cat
ing此文件将按以下顺序显示:当前级别、无警告消息的默认级别、最低级别和引导时间默认级别。
  #include<linux/module.h>
  #include<linux/kernel.h>
  static __init int log_init(void)
     {
         printk(KERN_INFO"inside init 4 \n");
         printk(KERN_ERR"inside init 3\n");
         printk(KERN_CRIT"inside init 2\n");

         return 0;
     }
  static __exit void log_exit(void)
    {
        printk("inside exit\n");
    }
  module_init(log_init);
  module_exit(log_exit);

  MODULE_LICENSE("GPL");