我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:大丰收高手论坛 > 动态缓冲区 >

printf缓冲区问题

归档日期:06-04       文本归类:动态缓冲区      文章编辑:爱尚语录

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

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

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

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

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

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

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

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

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

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

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

  首先介绍一下UNIX里面关于标准IO的几种缓冲机制全缓冲:全缓冲指的是系统在填满标准IO缓冲区之后才进行实际的IO操作;注意,对于驻留在磁盘上的文件来说通常是由标准IO库实施全缓冲。行缓冲:在这种情况...博文来自:blue丶的博客

  昨天在做Linux实验的时候,后面的同学发现一个很差异的现象!废话不说,先贴代码!           就是简单的fork小程序,简化之后的代码如下:#include#include#include#...博文来自:shanshanpt的专栏

  一个有趣的现象,printf函数没有按照预期的结果输出重复的字符串,单步调试显示代码的确走到了打印屏幕的分支,没有显示不由得想到了是不是缓冲区去刷新的问题,在打印语句后加上换行符后得到解决。...博文来自:topgunliu的专栏

  1.C标准库的I/O缓冲区     UNIX的传统是Everythingisafile,键盘、显示器、串口、磁盘等设备在/dev目录下都有一个特殊的设备文件与之对应,这些设备文件也可以像普通文件(保存...博文来自:Meditation

  程序输出有两种方式:一种是即时处理方式,另一种是先暂存起来,然后再大块写入的方式,前者往往造成较高的系统负担。因此,C语言实现通常都允许程序员进行实际的写操作之前控制产生的输出数据量。这种控制能力一般...博文来自:秋叶原 && Mike 麦克

  在书上看到的例子,是学习fork()创建新进程的时候,发现了printf()的不同的输出情况。在多次查资料的过程中,发现了居然是printf()的输出和缓冲区有关。#includelt;un...博文来自:颜言研的博客

  标准I/O缓冲区:标准i/O提供缓存的目的是尽可能减少使用read和write调用的次数。标准I/O提供类三种类型的缓冲全缓冲。这种情况下,在填满标准I/O缓冲区后才进行实际的I/O操作。对于驻留在磁...博文来自:ruohuanni的专栏

  printf是标准IO函数,存在行缓冲,先写到缓冲区,满足条件后,才将缓冲区刷到对应文件中,刷缓冲区的条件如下:1)缓冲区填满。2)写入的字符中有‘\n’,\r。3)调用fflush手动刷新缓...博文来自:jmlinux的博客

  标准C库glibc的printf, 这里就要区分一下标准库函数和系统调用了。 系统调用是内核提供给上层程序的接口,能够实现内核和上层之间的交互,系统调用在内核中的实现是软中断的方式,通过相应的中断服务...博文来自:梦想专栏

  printf缓冲区刷新条件:  1缓冲区填满   2写入的字符中有‘\n’\r   3调用fflush(stdout)手动刷新缓冲区   4调用scanf要从缓冲区中读取数据时,也会将缓冲区内的数...博文来自:Jalen_king

  我们可以用printk打印kernel的日志信息(即log信息),根据时间戳可以判断内核新打印的log会覆盖掉以前打印的log。原因是内核用环形缓冲区存放打印的log信息。那么如何增大缓冲区的大小呢?...博文来自:茫茫大士的专栏

  内存片(memoryslab)是一个内核对象,它允许从指定的内存区域上动态地分配内存块(memoryblock)。同一个内存片上面的所有内存块的尺寸是固定(相同)的,这样做的好处是可以高效地分配和释放...博文来自:lbaihao的专栏

  大家应该都知道,printf(),是先将格式化好的信息先输到缓冲区上,因为输入输出的缓存为行缓存,所以当填满I/O缓存后,才进行实际I/O操作或者遇到换行符‘\n’(或者执行fflush、floce、...博文来自:Infect_your_breath的博客

  部署了一个应用程序到Jenkins上以后,发现ConsoleOutput无法显示完整的log,发现是因为printf缓存的缘故。可以通过以下命令禁止缓存,使得更新的输出字符串能够尽快显示在终端上:se...博文来自:量化开发技术点集锦

  1.先说printf的优点,也就这一点了,那就是代码简洁,格式化方便,可以在格式化字符串里一次性将输出格式化。而ostream则需要一段一段地拆分,显得比较烦锁,特别是自定义输出类型的格式时,如格式化...博文来自:JAVA成长之路

  默认情况下,printf()的输出是缓冲的,如果没有换行符,不会立即输出到标准输出。如果想立即看到输出,可以1.在输入字符串末尾加上\n.2.输出到stderr:fprintf(stderr,...博文来自:小猪爱拱地

  1、缓冲区的定义(即什么是缓冲区):缓冲区又称为缓存它是内存空间的一部分。也就是说在内存空间中预留了一定的存储空间这些存储空间用来缓冲输入或输出的数据这部                  分预留的空...博文来自:root_robot的博客

  Scanf函数的缓冲区问题scanf输入字符串、整型、实型等数据判断的方式都一样,回车、空格、tab键都认为是一个数据的结束。但是字符不同于字符串,回车,空格很可能被当成字符被输进去,要特别注意!回车...博文来自:peixiaoge的博客

  printf()函数缓冲行输出的条件:(1);缓冲区满一行自动输出(一行缓冲区存放的字符很多)(2):printf()函数遇到‘\n’或‘\r’自动输出(3):执行到return0;(由于return...博文来自:peixiaoge的博客

  文件缓冲区的资源位于用户空间,因此,在创建子进程时,子进程的用户空间将复制父进程的用户空间的所有信息,显然,也包含流缓冲区的内容。如果流缓冲区中有临时的信息,则同样复制到子进程的用户空间流缓冲中#in...博文来自:weixin_36194037的博客

  scanf、getchar和缓冲区在程序中如何执行很多人在写完代码后执行程序时会遇到弹出黑框界面后又迅速消失的现象,解决这种问题的办法就是在代码结束部分加上system(“pause”);这条语句,或...博文来自:cottonrose_orange的博客

  转自:一个项目中需要迭代计算,时间长,但是在重定向输出的时候所有标准输出不能及时输出,这就要求程...博文来自:dreamgis的专栏

  工作中遇到的一个问题,bug再现如下:为什么printf没有输出?为什么有了\n就能输出了?printf\n是换行符,换行时会清空行缓存。或者手动flush stdout。那么缓存是什么,为什么有缓存...博文来自:csdn

  最近学习Windows进程控制相关的知识,发现一个以前没有注意到的问题:在多个进程共用一个控制台的时候,如果在某个时刻一起printf输出,那么输出的文字将会混合在一起。要解决这个问题,必须互斥的打印...博文来自:mrbone11的博客

  套接字中可以设置和获取多种可选项,包括套接字的类型(TCP套接字还是UDP套接字)、接收和发送缓冲区的大小等等,详见《TCP/IP网络编程》140页。我们利用getsockopt和setsockopt...博文来自:Hyman的博客

  缓冲区里保留所有从键盘打入的键,包括空格,空白键,回车。输入语句scanf(),gets(),...都是到缓冲区里按语法规则读东西,转换内容。当缓冲区里内容用完了,或不够输入语句用时,输入语句等待.....博文来自:neeJack的博客

  今天同样遇到了printf()不输出的情况,看来水很深,在网上找了找,将下面这些东西推荐给大家, 源连接:博文来自:有一种坚持就作不放弃

  缓冲区:由多个以不同速度或优先级运行的硬件或程序进程共享的数据存储区,在其中暂时保存数据。输出缓冲区的4个条件:1.遇到“\n”,立即刷新缓冲区。2.程序调用fflush函数刷新缓冲区3.程序以exi...博文来自:静沐暖阳的博客

  缓冲区溢出攻击是利用缓冲区溢出漏洞所进行的攻击行动如果有人利用栈中分配的缓冲区写溢出,悄悄地将一段恶意代码的首地址作为返回地址覆盖写到原先的正确的返回地址处。那么程序在执行ret的时候会悄悄地转移到这...博文来自:linxizi0622的博客

  当我们在计算机上保存数据的时候,其实是先在内存中保存一定时间,再写入硬盘。这其实是一种缓存机制,当在内存中保存的数据需要被读取的时候,从内存中读取要比从硬盘中读取快得多。不过,这也会带来一些问题,如果...博文来自:zyy1659949090的博客

  setbuf函数用于打开和关闭缓冲机制,今天看看关闭缓冲区的功能。昨天在网上看到一个小程序,printf打印不出数据来,我们来看看。#includeintmain(void){inti=0;for(i...博文来自:pan-ma的博客

  讨论下scanf函数,输入缓冲区的关系样例来源于算法竞赛入门经典第一章实验部分的内容,经过测试发现scanf函数对于整形数据在读入时会过滤掉空格符、换行符和水平制表符。按照提示,如果b的值非法,比...博文来自:Veniversum的博客

  使用的是全志H3的芯片,运行Debian Desktop系统的ARM版本Armbian,要控制外部几个IO口,可以使用很多种方法,如果对GPIO的操作速度有要求就需要使用直接操作内存寄存器的方式来控制...博文来自:欢迎光临

  一、图像内插-最近邻内插法 1、数学原理      当一幅二维数字图像从源图像N*M被放为(j*N) * (k*M)目标图像是,参照数学斜率计算公式      必然有: (X1 – Xmin)/...博文来自:清风似水流的专栏

  最近比较有空,大四出来实习几个月了,作为实习狗的我,被叫去研究Docker了,汗汗! Docker的三大核心概念:镜像、容器、仓库 镜像:类似虚拟机的镜像、用俗话说就是安装文件。 容器:类似一个轻量...博文来自:我走小路的博客

  一个例子高斯混合模型(Gaussian Mixed Model)指的是多个高斯分布函数的线性组合,理论上GMM可以拟合出任意类型的分布,通常用于解决同一集合下的数据包含多个不同的分布的情况(或者是同一...博文来自:小平子的专栏

  docx4j官方提供了一些例子,本文只是其中一部分应用的简单例子。需要注意的地方是页眉和页脚,必须创建对应关系才能起作用。页眉和页脚添加图片的时候,第二个参数sourcePart是必须的,调用的cre...博文来自:偶尔记一下

  alpha:表示目前为止找到的最小数 beta:表示目前为止找到的最大数 1.极大层的上一层是极小层。一方面极大层找的是自己的子节点中的最大值,另一方面极大层的上一层找的是极大层们提供的节点中的最小一...博文来自:脚踏实地,仰望星空

  一般这个错误时不能打开应用程序进行写操作,有可能是该程序已经运行,不让写,所以会出现链接错误!打开任务管理器将其终止即可!!...博文来自:maokaijiang的专栏

  强连通分量: 简言之 就是找环(每条边只走一次,两两可达) 孤立的一个点也是一个连通分量   使用tarjan算法 在嵌套的多个环中优先得到最大环( 最小环就是每个孤立点)   定义: int Ti...博文来自:九野的博客

  jquery/js实现一个网页同时调用多个倒计时(最新的) 最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦! //js ...博文来自:Websites

  兄弟姐妹们,如需转载请标明出处:总目录 各位乡亲父老们!人工智能,马上就要爆发了。一旦爆发,将会如黄河泛滥一发不可收拾。...博文来自:床长的专栏

本文链接:http://quangdungfc.net/dongtaihuanchongqu/258.html

上一篇:缓冲区溢出漏洞

下一篇:没有了