内核使用printk()打印!
应用层使用printf()打印!

&&& 大部分常用的C库函数在Linux内核中都已经得到了实现。在所有没有实现的函数中,最著名的就数printf()函数了。内核代码虽然无法调用  printf()函数,但它可以调用printk()函数。printk()函数负责把格式化好的字符串拷贝到内核日志缓冲上,这样syslog程序就可  以通过读取该缓冲区来获取内核信息。printk()的用法很像printf(): & printk("Hello world!A  string:%s and an integer:%d\n",a_string,an_integer); & printk()和printf()之间的一个显著区别在于printk()允许通过指定一个标志来设置优先级。syslog会根据这个优先级标  志来决定在什么地方显示这条系统信息。下面是一个使用这种优先级标志的例子: & printk(KERN_ERR "this is an  error!\n");

&&&&& printk()函数是直接使用了向终端写函数tty_write()。而printf()函数是调用write()系统调用函数向标准输出设备写。所以  在用户态(如进程0)不能够直接使用printk()函数,而在内核态由于他已是特权级,所以无需系统调用来改变特权级,因而能够直接使用  printk()函数。

printf是咋使用了标准的C库函数的时候才能使用的,而内核中无法使用标准的C库函数,所以就连最常见的printf都不能使用。

例如子printk函数的字符串参数中使用了KERN_ALERT,它实际上扩展为字符串:“<1>”,而这部分信息没有输出到终端。实际上,这部分是内核信息的日志级别,只有超过了当前日志级别的信息才会输出到终端。当前内核的日志级别可以在/proc/sys/kernel/printk文件中看到。这个文件包含了四个整数,其中前两个是控制台的当前日志级别和默认日志级别。我们在printk的参数中使用较高的日志级别就是要保证信息得到输出。在<linux/kernel.h>头文件里一共定义了8个级别(0-7)的输出,从高到低分别由如下常量表示:

KERN_EMERG         :    最高级别,一般只用来打印崩溃信息

KERN_ALERT         :    需要立即处理的信息

KERN_CRIT          :    关键信息,一般用来显示严重的硬件和软件错误

KERN_ERR           :    用来显示硬件错误

KERN_WARNING       :    显示不会造成严重错误的警告信息

KERN_NOTICE        :    显示需要引起注意的信息

KERN_INFO          :  显示一般信息,例如驱动所发现的硬件列表

KERN_DEBUG    :  用来显示调试信息

printk与printf的一个区别printk是“行驱动”的,也就是说只有收到一个换行符数据才会真正输出到终端,否则就不会有任何信息输出。另一个值得注意的问题是我们在调试嵌入式设备的时候,经常是从串口获得显示信息,如果我们使用printk过于频繁的话,串口的传输速度就会成为瓶颈,这样会造成系统的性能下降甚至停止反应。

via:http://blog.chinaunix.net/uid-25749806-id-461471.html

printk和printf的区别的更多相关文章

  1. java中print\println\printf的区别

    print\println\printf的区别 print将它的参数显示在命令窗口,并将输出光标定位在所显示的最后一个字符之后. println 将它的参数显示在命令窗口,并在结尾加上换行符,将输出光 ...

  2. print与printf的区别

    print与printf的区别 1,print 中不能使用%s ,%d 或%c: 2,print 自动换行,printf 没有自动换行. 纯粹做下笔记哈!很多东西不知道,也就只能这样了!

  3. C++中print和printf的区别

    print与printf的区别 1,print 中不能使用%s ,%d 或%c: 2,print 自动换行,printf 没有自动换行.

  4. Go: Println 与 Printf 的区别

    Go 学习笔记:Println 与 Printf 的区别,以及 Printf 的详细用法 2017-12-19 15:39:05 zgh0711 阅读数 26255更多 分类专栏: Go   版权声明 ...

  5. print、println、printf的区别(转载)

    printf主要是继承了C语言的printf的一些特性,可以进行格式化输出   print就是一般的标准输出,但是不换行   println和print基本没什么差别,就是最后会换行   System ...

  6. Go 学习之路:Println 与 Printf 的区别

    Println 和Printf 都是fmt包中公共方法:在需要打印信息时常用的函数,那么二函数有什么区别呢? 附上代码 package main import ("time"&qu ...

  7. Go语言中 Print,Println 和 Printf 的区别(八)

    Print 和 Println 这两个打印方式类似,只在格式上有区别 1. Println 打印的每一项之间都会有空行,Print 没有,例如: fmt.Println("go", ...

  8. puts fputs printf的区别

    puts()显示字符串时自动在其后添加一个换行符,函数里的参数是一个地址,从该地址向后面输出,直到遇到空字符,所以要确保输出的字符串里要有空字符.与gets()函数一起使用. fputs()需要第二个 ...

  9. echo 与 printf的区别与联系

    echo命令默认是带有换行符的. 如果想让echo命令去掉每一行后面的换行符 方法1; 如果确信自己的脚本程序只运行在bash上,可以使用如下语法来出去空格: echo -n "Is it ...

随机推荐

  1. HDU 2389 Rain on your Parade

    大意:在一个二维坐标系上有nx个人和ny把伞,每个人都有自己的移动速度,问有多少人可以再 time 时间内移动到不同的雨伞处(不允许两个人共用一把伞).   输入数据: 第一行是一个T代表T组测试数据 ...

  2. http 400 错误的请求怎么解决

    HTTP400是个错误的统称 你将IE选项-高级中的显示HTTP友好错误信息前面的勾去掉. 然后在开这个页,,把错误代码复制出来 .其实有时是网页本身已经不可用了,你先关掉浏览器稍等一会再登陆网页也是 ...

  3. app开发历程——android手机显示服务器端图片思路

    以前自己都不知道怎么去显示服务器端的图片,还好在apkbus论坛上找到一个特别简单的例子.虽然一天天忙忙碌碌,但是自己内心其实有一种想逃的心里,说不定哪天就会冒出来. 1.首先服务器端图片 这里的Im ...

  4. javascript 判断整数

    判断整数的方法有两种:正则判断和逐字判断. 由于逐字判断效率过于低下,这里就不予描述了,有兴趣的看客可以自己谷歌. 1.正则判断 var r = /^\+?[1-9][0-9]*$/; //正整数 c ...

  5. java--I/O流总结

    java中的I/O流从所操作的数据单元上分为两类:字节流和字符流. 1.字节流 字节流主要有两个抽象基类:InputStream和OutputStream:其中InputStream是输入字节流,Ou ...

  6. QT5 TK1 串口通信

    对TK1中基于QT5的串口通信过程进行总结.按照软件安装及通信实现的顺序. 1.QT5安装 较简洁方式:打开软件中心(类似A形),搜索qtcreator,点击安装即可. 2.串口通信库安装 采用上述方 ...

  7. Tomcat中server.xml配置及Context的配置说明

    server.xml配置简介         下面是这个文件中的基本配置信息,更具体的配置信息见tomcat的文档         server:         port     指定一个端口,这个 ...

  8. HTML5 Canvas渐进填充与透明

    详细解释HTML5 Canvas中渐进填充的参数设置与使用,Canvas中透明度的设置与使 用,结合渐进填充与透明度支持,实现图像的Mask效果. 一:渐进填充(Gradient Fill) Canv ...

  9. Redis源代码分析(三)---dict哈希结构

    昨天分析完adlist的Redis代码.今天立即马不停蹄的继续学习Redis代码中的哈希部分的结构学习,只是在这里他不叫什么hashMap,而是叫dict.并且是一种全新设计的一种哈希结构,他仅仅是通 ...

  10. server的散热和Linux中温度的检測

    当server被放在散热条件不好的条件下,这样会导致硬盘驱动过早损坏,而且server其它的组件也会非常快出现问题. 现代的server主板检測到CPU过热的时候,一般会限制CPU的频率,所以即使se ...