printf行缓冲区的分析总结

2013-08-18 12:29 5222人阅读 评论(7) 收藏 举报
 分类:
app program(9) 

版权声明:本文为博主kerneler辛苦原创,未经允许不得转载。

最近在客户那调试串口的时候,read串口然后printf打印,单字符printf,发现没有输出,后来想起来printf这些标准输入输出函数也是属于标准C库glibc的,

这里就要区分一下标准库函数和系统调用了。

系统调用是内核提供给上层程序的接口,能够实现内核和上层之间的交互,系统调用在内核中的实现是软中断的方式,通过相应的中断服务例程来实现,而标准库函数是在系统调用的基础之上封装的应用程序,完全运行在用户态,在必要的时候调用系统调用。编写应用程序可以直接使用应用程序也可以使用库函数,那为什么还要有库函数呢。

以printf为例,在printf的实现中,在调用write之前加入了IO缓冲区,这是一个用户空间的缓冲,首先要说明一点,系统调用是软中断,频繁调用,需要内核频繁陷入内核态,这样的效率不是很高,而printf实际是向用户空间的IO缓冲写,在满足条件的情况下(条件下面会说)才会调用write系统调用,这样也就提高了内核的效率。

对于普通的文件操作,库函数因为IO缓冲区,效率高,其他方面与直接调用系统调用无异,但是对于一些特殊的文件,如串口终端以及网络设备。对于应用程序来将,我们更加希望的是每次的操作能够真真正正的反映在底层的硬件上,这时我们最好就不要使用类似与printf这样的带IO缓冲区的标准库函数了,而是直接使用系统调用,我上面就是犯了这个错误。

说完标准库函数和系统调用的区别,我们就要具体的分析一下printf。

printf是一个行缓冲函数,先写到缓冲区,满足条件后,才将缓冲区刷到对应文件中,刷缓冲区的条件如下:

1 缓冲区填满

2 写入的字符中有‘\n’ '\r'

3 调用fflush手动刷新缓冲区

4 调用scanf要从缓冲区中读取数据时,也会将缓冲区内的数据刷新

满足上面4个条件之一缓冲区就会刷新,,也就是printf会真正调用write来写入

当我们执行printf的进程或者线程结束的时候会主动调用flush来刷新缓冲区,所以程序结束,也会刷新

如果我们沦落到调用printf后再调用fflush来刷新的话,我感觉还不如调用write来的直接呢

其他的3点都好理解,下面我们就手动来研究一下printf的缓冲区到底有多大?

这就需要我们写一个小程序来验证一下,程序如下:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    int i = 0x61;
    while(1)
    {   
        printf("%c", i); 
        i++;
        i = (i - 0x61) % 26 + 0x61;
        usleep(1000);
    }   
    return 0;
}

在本地机器上编译这个程序,之后运行,在屏幕第一次输出结构后ctrl+C杀死,将结果保存在一个文件中,ls -l查看一下这个文件

我查看这个文件大小是1025个字节,这也就说明printf的缓冲区是1024byte,当写入第1025字节时刷新缓冲区到终端下。

c printf 缓冲区分析相关推荐

  1. SuperMap.IS.AjaxScript缓冲区分析及专题图制作

    在缓冲区分析上,SuperMap.IS.AjaxScript提供的主要功能函数有spatialAnalystManager.BufferQuery(bufferParam,qeruyParam,onC ...

  2. 【ArcGIS风暴】缓冲区分析、叠置分析综合实验案例:购房区域的选择

    实验平台:ArcGIS 9.3 实验目的:熟练掌握A rcGIS缓冲区分析和叠置分析操作,综合利用各项空间分析工具解决实际问题. 实验要求:对每个条件进行缓冲区分析,运用空间叠置分析对多个图层叠加,并 ...

  3. ArcGIS实验教程——实验十七:缓冲区分析(Buffer Analysis)

    ArcGIS实验视频教程合集:<ArcGIS实验教程从入门到精通>(附配套实验数据) [实验描述] 缓冲区(Buffer)是为了识别某一地理实体对周围地物的影响而在其周围建立的一定宽度多边 ...

  4. 缓冲区分析—ArcGIS API for JavaScript

    缓冲区分析是地理信息系统中的空间分析基本功能之一,是众多空间分析方法的基础.缓冲区分析是指为了识别某地理实体或空间物体对其周围的邻近性或影响度而在其周围建立的一定宽度的带状区. 缓冲区介绍 缓冲区分析 ...

  5. Oracle Spatial 空间分析之缓冲区分析

    缓冲区分析需要主要使用Oracle Spatial 空间分析操作函数,下面会对其各个参数进行详细讲解,资料有来源于网上与书上. 使用Oracle Spatial 空间分析操作函数--SDO_WITHI ...

  6. AE二次开发中几个功能速成归纳(符号设计器、创建要素、图形编辑、属性表编辑、缓冲区分析)...

    /** 实习课上讲进阶功能所用文档,因为赶时间从网上抄抄改改,凑合能用,记录一下以备个人后用.** -------------------------------------------------- ...

  7. GIS应用技巧之缓冲区分析

    一.缓冲区介绍 缓冲区是地理空间目标的一种影响范围或服务范围,是对选中的一组或一类地图要素(点.线或面)按设定的距离条件,围绕其要素而形成一定缓冲区多边形实体,从而实现数据在二维空间得以扩展的信息分析 ...

  8. ArcGis缓冲区分析

    所以我的思路如下: 使用arcgis javascript api 的Draw工具( esri/toolbars/draw ),主要功能是绘制出点线面. 然后再计算绘制出来的图形,这里需要使用geom ...

  9. cesium中缓冲区分析

    效果 这里是点缓冲区与点数据分析的15000个点 代码 添加缓冲区 /*** @Description: 初始化点缓冲* @param centerPoint 缓冲区中心点* @param dataP ...

最新文章

  1. 算法设计与分析第2章 递归与分治策略
  2. linux2.6内核链表
  3. LAMP源码编译安装配置+wordpress
  4. 算术运算符举例java_Java的算术运算符简介
  5. AllocateAndInitializeSid function
  6. SQLite3中的数据类型
  7. 关于云原生需要了解什么
  8. java jbutton 事件_java-需要JButton事件支持
  9. linux 误删etc,centos7中误删/etc/passwd与etc/shadow文件恢复
  10. python中join和split使用
  11. 2015 ACM/ICPC Asia Regional Shenyang Online题解
  12. 思科6509系统升级及单引擎升级为双引擎
  13. 一阶系统开环传递函数表达式_自动控制总结:第二章、控制系统的数学模型
  14. 飞鸽传书2011下载(飞鸽传书)
  15. 安装SQL Server 2017遇到“以前的某个安装需要重新引导计算机以便使更改生效”的问题
  16. 现代信号处理教程第二版(胡广书)学习笔记
  17. 记一次usb3.0千兆网卡的选购经历;
  18. 计算机专业可以报初级经济师吗,初级经济师值得考吗
  19. Matlab中meshgrid的用法
  20. 2022年3月盗取微软源代码的 APT组织 lapsus$完整资料汇总

热门文章

  1. 用git rebase合并
  2. 每一个有理想的程序员都应该读的一本书-《rework》
  3. mysql修改表、字段、库的字符集(转)
  4. 在运行期通过反射了解JVM内部机制
  5. 谁在关心toString的性能?
  6. 程序员面试题精选100题(15)-含有指针成员的类的拷贝[C/C++/C#]
  7. SIFT原理与源码分析
  8. redis和memcached的区别(总结)
  9. SpringBoot(六)_AOP统一处理请求
  10. 校园交易平台后台系统git操作全过程