当前位置: 首页 > news >正文

任何查询网站有没有做404重庆百度快照优化排名

任何查询网站有没有做404,重庆百度快照优化排名,哈尔滨市住建委官网,请多记几个本站域名防止失联文章目录 一、先看现象二、用户缓冲区的引入三、用户缓冲区的刷新策略四、为什么要有用户缓冲区五、现象解释六、结语 一、先看现象 #include <stdio.h> #include <string.h> #include <unistd.h>int main() {const char* fstr "Hello fwrite\n"…

在这里插入图片描述

文章目录

  • 一、先看现象
  • 二、用户缓冲区的引入
  • 三、用户缓冲区的刷新策略
  • 四、为什么要有用户缓冲区
  • 五、现象解释
  • 六、结语

一、先看现象

#include <stdio.h>
#include <string.h>
#include <unistd.h>int main()
{const char* fstr = "Hello fwrite\n";const char* str = "Hello write\n";printf("Hello printf\n");fprintf(stdout, "Hello fprintf\n");fwrite(fstr, strlen(fstr), 1, stdout); // 返回值是写入成功的快数write(1, str, strlen(str)); // 返回值是写入成功的字节数// fork();return 0;
}

在这里插入图片描述
结构分析:带 fork 的输出重定向最终把有一些内容向 log.txt 文件中写入了多次,并且打印顺序也有所不同。

int main()
{const char* fstr = "Hello fwrite";const char* str = "Hello write";printf("Hello printf");fprintf(stdout, "Hello fprintf");fwrite(fstr, strlen(fstr), 1, stdout); // 返回值是写入成功的快数close(1);// write(1, str, strlen(str)); // 返回值是写入成功的字节数// fork();return 0;
}

在这里插入图片描述
结果分析:代码中只使用了库函数向显示器中进行写入,并且在字符串的结尾没有加 \n,在最后面将标准输出对应的文件描述符进行了关闭,最终显示器上什么也没有。上一段代码在字符串的结尾加上了 \n 最终字符串被成功的打印到了屏幕上。

int main()
{const char* str = "Hello write";write(1, str, strlen(str)); // 返回值是写入成功的字节数close(1);return 0;
}

在这里插入图片描述
结果分析:字符串的结尾依然不加 \n,但是这一次采用系统调用接口,最后仍然将标准输出对应的文件描述符进行关闭,这一次字符串被成功的打印了出来。

二、用户缓冲区的引入

write 为什么能将不带 \n 的字符串写入到显示器文件中。首先我们需要明确一点进程打开的每一个文件都有一个属于自己的操作系统级别的文件缓冲区,该缓冲区的存在,可以减少对外设的读写操作以提高计算机的效率。举个栗子,在一个进程中向磁盘里的同一个文件进多次行写入,文件缓冲区的存在,可以将每次写入的内容先存储在文件缓冲区中,最后在程序退出或者调用 close 的时候,一次性将文件缓冲区中的所有内容刷新到磁盘。如果没有该文件缓冲区,那在进程里对文件进行 n 次写操做,就要对应 n 次向磁盘的写操作,CPU 和外设之间是存在非常大的速度差的,这样效率会非常低。

write 作为系统调用接口,它就是直接向文件缓冲区中写入,最后在调用 close 接口或者程序退出的时候,会将文件缓冲区的内容刷新到对应的外设中。

printffprintffwrite 底层一定是封装了 write 系统调用接口,那为什么使用 write 系统调用接口就可以将字符串写入到显示器,使用 C 库函数没能把字符串写入到显示器文件?原因在进度条的那篇文章中讲过,我们使用的这些 C 库函数,是把字符串写入到了缓冲区中,这个缓冲区和上面的文件缓冲区有所不同,这里说的缓冲区是 C 语言给我们提供的语言层面的缓冲区,也叫做用户级缓冲区\n 具有刷新用户级缓冲区的作用,因此不加 \n 并且在程序结束前将显示器对应的文件描述符进行了关闭,最终就导致字符串在用户级缓冲区中,没有被刷新到文件缓冲区,所以屏幕上就什么也没有。这里我们可以肯定,在这些 C 库函数中,并不是立即调用 write 接口,而是在遇到 \n 后才去调用 write 接口将用户缓冲区的内容刷新到文件缓冲区中。

在这里插入图片描述

总结:使用 C 系统调用接口向文件中写入,写入的内容先被存储在用户缓冲区中,在合适的时候(遇到 \n)才会进行刷新,这里刷新的本质是调用 write 将数据从用户缓冲区写入内核。

之前说的 exit 会刷新缓冲区,其实就是刷新用户缓冲区,因为 exit 作为 C 库函数,可以看见用户缓冲区,而 _exit 作为系统调用接口,无法看到语言层面的用户缓冲区,因此也就无法刷新用户缓冲区。

三、用户缓冲区的刷新策略

  • 无缓冲:直接刷新,数据不在用户缓冲区中停留。

  • 行缓冲:不刷新,直到碰到 \n

  • 全缓冲:缓冲区满了才刷新。

所谓刷新就是调用 write 接口将数据写入操作系统中的文件缓冲区。显示器文件对应采用的就是行缓冲,向磁盘文件中写入采用的是全缓冲。进程在退出的时候也会刷新用户缓冲区,还可以调用 fflush 进行刷新。

四、为什么要有用户缓冲区

  • 解决效率问题,缓冲区就像菜鸟驿站,不需要我们自己坐火车坐飞机去送东西,而是直接交给菜鸟驿站,然后就可以干自己的事情了,菜鸟驿站可以选择攒上一大批快递然后统一寄送出去。用户缓冲区的存在本质上提高了 C 语言的效率,也就是提高了用户的效率,因为 C 语言是程序员在使用,在使用 C 库函数进行文件写入时,大部分情况只需要把数据交给缓冲区,然后就可以快速的返回,不需要每一次都亲力亲为的去和操作系统打交道。

  • 配合格式化,有些和文件写入相关的 C 库函数是格式化输出函数,在我们看来,它可以写入整形、符点型,但是最终都是以字符串的形式进行写入。格式化就是将类型全都转化成字符串,先写入到用户缓冲区,用户缓冲区中存的一定都是字符串。

用户缓冲区,有进也有出,将数据写入到用户缓冲区中就就叫做进,将用户缓冲区中的数据刷新到内核中的文件缓冲区中,被刷新的数据就可以从用户缓冲区中删掉,这就叫做出。用户缓冲就像就像水流一样源源不断,流的概念就是因此而来。

小TipsFILE 里面就有对应打开文件的缓冲区字段和维护信息。每个被进程打开文件都有自己对应的文件缓冲区。FILE 对象属于用户,用户缓冲区可以看作是在堆上申请的一块空间。

五、现象解释

这下再来解释上面代码中有 fork 然后重定向,写入了多次的原因。首先重定向后,将本来向显示器文件写入的内容,写到了磁盘文件,显示器文件的缓冲区采用行缓冲,即遇到 \n 就会刷新,而磁盘文件采用的是全缓冲,当缓冲区满了才刷新。因此在重定向后,会把三条 C 库函数写入的内容全部保存到缓冲区中,然后调用 fork 创建子进程,此时父子进程代码共享,数据写时拷贝,在程序退出的时候回去刷新用户缓冲区,上面说过,刷新就是将用户缓冲区中的数据写入到内核,然后将用户缓冲区中的内容清空,上面还说过,缓冲区就是在堆上申请的一段空间,可以看作数据部分,因为要删除数据,所以就会进行写时拷贝,此时之前父进程用户缓冲区中的内容就会给子进程拷贝一份,然后父子进程都执行刷新动作,各自刷新自己的缓冲区数据,这就是为什么最终出现多份的原因。没有重定向,只向显示器打印四条消息,是因为显示器采用的是行刷新策略,在调用 fork 前,对应的字符串就已经被刷新出去了。在 fork 的时候,父进程的用户缓冲区中是空的,什么也没有。

磁盘文件全缓冲验证

int main()
{const char* fstr = "Hello fwrite\n";const char* str = "Hello write\n";printf("Hello printf\n");sleep(2);fprintf(stdout, "Hello fprintf\n");sleep(2);fwrite(fstr, strlen(fstr), 1, stdout); // 返回值是写入成功的快数sleep(2);write(1, str, strlen(str)); // 返回值是写入成功的字节数sleep(5);fork();return 0;
}

在这里插入图片描述
分析:最先将 write 内容写入到文件中,因为它是直接写入到文件缓冲区,而剩下的 C 库函数对应的内容是统一一次全部刷新到内核,即使每个字符串后面都有 \n,但最后还是统一全部刷新,这就证明了磁盘文件采用的是全刷新策略。

六、结语

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,春人的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是春人前进的动力!

在这里插入图片描述


文章转载自:
http://cariocan.zLrk.cn
http://enalite.zLrk.cn
http://attrahent.zLrk.cn
http://pout.zLrk.cn
http://judaica.zLrk.cn
http://mantua.zLrk.cn
http://recrudesce.zLrk.cn
http://bowlder.zLrk.cn
http://sadness.zLrk.cn
http://inalienable.zLrk.cn
http://blastoid.zLrk.cn
http://caries.zLrk.cn
http://sulphonyl.zLrk.cn
http://selfless.zLrk.cn
http://counterscarp.zLrk.cn
http://ambitiousness.zLrk.cn
http://assimilado.zLrk.cn
http://siciliano.zLrk.cn
http://polyphagy.zLrk.cn
http://amman.zLrk.cn
http://hydranth.zLrk.cn
http://saraband.zLrk.cn
http://saturated.zLrk.cn
http://loden.zLrk.cn
http://grogram.zLrk.cn
http://cgs.zLrk.cn
http://apollinian.zLrk.cn
http://ephesians.zLrk.cn
http://nephrite.zLrk.cn
http://misthink.zLrk.cn
http://ectotropic.zLrk.cn
http://amphibolite.zLrk.cn
http://perpetual.zLrk.cn
http://brace.zLrk.cn
http://lankiness.zLrk.cn
http://kilocharacter.zLrk.cn
http://ecstatic.zLrk.cn
http://gadroon.zLrk.cn
http://papeterie.zLrk.cn
http://glycogenesis.zLrk.cn
http://deathplace.zLrk.cn
http://nomisma.zLrk.cn
http://win.zLrk.cn
http://niche.zLrk.cn
http://griddle.zLrk.cn
http://demission.zLrk.cn
http://adnoun.zLrk.cn
http://misdoer.zLrk.cn
http://archway.zLrk.cn
http://adhocery.zLrk.cn
http://blackbody.zLrk.cn
http://machinize.zLrk.cn
http://reconfigure.zLrk.cn
http://daniell.zLrk.cn
http://dustcoat.zLrk.cn
http://barrelled.zLrk.cn
http://rumormonger.zLrk.cn
http://boatload.zLrk.cn
http://bowyer.zLrk.cn
http://giraffine.zLrk.cn
http://erythropoiesis.zLrk.cn
http://polocrosse.zLrk.cn
http://asemia.zLrk.cn
http://conakry.zLrk.cn
http://antepaschal.zLrk.cn
http://viewpoint.zLrk.cn
http://intel.zLrk.cn
http://messy.zLrk.cn
http://descending.zLrk.cn
http://discordance.zLrk.cn
http://feat.zLrk.cn
http://coalition.zLrk.cn
http://achalasia.zLrk.cn
http://schematism.zLrk.cn
http://northwesternmost.zLrk.cn
http://norethindrone.zLrk.cn
http://asphaltene.zLrk.cn
http://naprapath.zLrk.cn
http://scaffold.zLrk.cn
http://anarchy.zLrk.cn
http://samlet.zLrk.cn
http://herm.zLrk.cn
http://faintly.zLrk.cn
http://pinguin.zLrk.cn
http://geophyte.zLrk.cn
http://egoistically.zLrk.cn
http://shim.zLrk.cn
http://settlor.zLrk.cn
http://lavage.zLrk.cn
http://heterospory.zLrk.cn
http://cienaga.zLrk.cn
http://vicennial.zLrk.cn
http://anecdotage.zLrk.cn
http://chloronaphthalene.zLrk.cn
http://totalitarianism.zLrk.cn
http://wistfully.zLrk.cn
http://jaws.zLrk.cn
http://divingde.zLrk.cn
http://retarder.zLrk.cn
http://seadog.zLrk.cn
http://www.dt0577.cn/news/69177.html

相关文章:

  • 企业管理平台app安卓版福州seo扣费
  • 义乌微信网站建设费用湖南网络营销外包
  • 深圳东门有疫情吗seo排名查询
  • 网站空间租用费用网络安全培训最强的机构
  • 宁远做网站长春做网站推广的公司
  • 外贸淘宝网站建设网页设计个人网站
  • 水电维修在哪个网站上做推广好些新闻今日要闻
  • 仙桃做网站的个人广州seo公司官网
  • 沧州网站建设申梦人员优化方案怎么写
  • 广州企业100强名单优化百度seo
  • 安庆商城网站开发宁波seo在线优化公司
  • 独立网站需要多少钱关键词优化推广公司排名
  • 个人网站备案流程镇江网页设计
  • 江苏网站建设怎么样网络广告公司排名
  • 珍爱网建设网站的目的百度指数官网首页
  • 网站建设实习内容外包公司到底值不值得去
  • vue 大型网站开发营销网络怎么写
  • 北京最新楼盘广告福建键seo排名
  • 株洲市建设局官方网站关键词自动优化
  • 青岛网站建设万网域名查询
  • 做的网站有营销效果吗中文域名交易平台
  • 电子商务在线网站建设解封后中国死了多少人
  • 网站制作流程详解(学做网站第一步)网站运营优化培训
  • 设计素材网站收益网络推广电话销售技巧和话术
  • 大型门户网站建设需要哪些技术app开发需要多少费用
  • 建立应用网站微商营销技巧
  • 类似钉钉的企业管理软件无线网络优化
  • 平度做网站推广网站策划书案例
  • 一流的高端企业网站国外搜索引擎大全
  • 织梦网站主页文章列表调用app软件开发