内核使用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. -_-#【Angular】自定义指令directive

    AngularJS学习笔记 <!DOCTYPE html> <html ng-app="Demo"> <head> <meta chars ...

  2. HDOJ(HDU) 2083 简易版之最短距离(中位数)

    Problem Description 寒假的时候,ACBOY要去拜访很多朋友,恰巧他所有朋友的家都处在坐标平面的X轴上.ACBOY可以任意选择一个朋友的家开始访问,但是每次访问后他都必须回到出发点, ...

  3. C++ STL之string常用指令

    string,大小可变的字符串,有些类似于C中的字符数组. 只记载本人在ACM中常用的函数,并且全部经过程序测试. 1.初始化 string s1;——默认构造函数s1为空串 string s2(s1 ...

  4. [oracle安装错误处理]ORA-00600: [keltnfy-ldmInit][46], [1], []

    原博文:http://blog.itpub.net/519536/viewspace-614893/ 今天在部署一套10g Oracle(10.2.0.3版本)的过程中,偶遇ORA-00600: in ...

  5. C++ —— 笔记汇总

    导读 本文仅用于记录在个人在使用C++过程中的遇到一些的疑问和概念. 目录 语法和概念基础 常用函数 编程注意 编译问题 拓展链接 1.语法和概念基础 1.块域     2.static 作用域    ...

  6. Object-C @synthesize -- 笔记

  7. Unity3D基础学习 利用NGUI的Texture播放视频

    利用NGUI播放视频,首先你得导入你的视频 你的电脑中必须安装QuickTime软件,没有,去下一个,如果是Windows系统,安装完之后重启. 接下来转换你的视频格式,如果你的视频在QuickTim ...

  8. iOS8新特性之基于地理位置的消息通知UILocalNotification

              苹果在WWDC2014上正式公布了全新的iOS8操作系统. 界面上iOS8与iOS7相比变化不大,只是在功能方面进行了完好.                             ...

  9. [AngularJS] Using $parse Service

    $parse is useful when you want to parse an expression and the context is not defined yet. For exampl ...

  10. [Javascript] Advanced Reduce: Flatten, Flatmap and ReduceRight

    Learn a few advanced reduction patterns: flatten allows you to merge a set of arrays into a single a ...