【戒焦戒躁,can win】Linux--IO缓冲区
- fopen干了啥
- 缓冲区
- 缓冲策略
- 父子进程与缓冲区的关联
- 系统调用:文件重定向
- 进一步理解:Linux 一切皆文件
fopen干了啥
书接上文,下面这些代码都是系统函数调用,不能即用C库函数,又用系统函数。
举个例子。fopen
打开文件返回的是FILE*
类型,不能直接将其传入到write
。因为 write
接收的文件描述符是int
类型。事实上,FILE*
类型内部封装了一个文件描述符,文件描述符就是文件描述符指针数组的下标,通过该文件描述符就可以找到对应文件,从而进行读写。更改数组的指向,就可以实现重定向。
其中,fopen
首先申请struct File
结构体空间,然后返回其地址,也就是 struct File*
,然后调用系统调用函数open
得到文件描述符,将文件描述符填充到结构体中。
缓冲区
运行下面这段代码的效果,看上去是程序先休眠后打印。但实际上,程序是先打印,后睡眠,因为打印未显示出来,所以从运行效果上看,就是先睡眠后打印。
造成这种结果的原因是数据先被缓存起来了。
缓冲策略
- 无缓冲
- 行缓冲: 只有当内存行缓冲区打满或者遇到
\n
,系统才会把缓冲区内的数据刷新。 - 全缓冲:对磁盘文件写入时采用的策略。需要将缓冲区写满,才能写到磁盘文件中。
之所以要有缓冲区,这是由计算机体系决定的。外设由于是机械设备,它的输入输出速度跟不上中央处理器的速度,因此就需要在输入输出时先将数据缓存到内存中,再进行后续处理。
父子进程与缓冲区的关联
运行上面代码,将结果显示到显示器上,得到的结果为三个函数以此的打印结果。
当运行时将打印结果重定向,结果如下。
造成这两种结果的原因是:当我们往显示器上打印,缓冲策略采用的是行刷新。因为往显示器打印字符串的函数调用都带有\n
,所以在fork
之前,程序已经打印并刷新,缓冲区内没有数据,不存在写时拷贝。
当重定向到一个磁盘文件时,缓冲策略变成全缓冲。此时\n
对全缓冲没有影响,字符串只打印不刷新,字符串存在缓冲区中,当执行fork
时,进程结束要刷新修改缓冲区内的数据,因为父子进程要保持独立性,所以在子进程也会拷贝一份缓冲区的数据,即写时拷贝。
因此调用C库函数就分别打印了两次。而系统调用write
是没有缓冲区的,只打印一次。那么,这个缓冲区就是C语言提供的,若是系统提供的,那么write
也应该有缓冲区,打印两次,两者构成矛盾。
需要注意的是内存分为用户空间和系统空间,语言本身提供的缓冲区在用户空间中,为了将此缓冲区数据写入磁盘文件中,还需经过系统缓冲区,系统缓冲区将数据最后写到磁盘文件。
系统调用:文件重定向
这里使用dup2
系统调用函数,使得1号文件描述符的指向和fd的指向一致,也就是文件描述符指针数组下标不变,内容变了,结果就是两者都指向同一个struct file
,由此实现了重定向。可以看到往1号文件描述符写数据,数据写进了文本内。
进一步理解:Linux 一切皆文件
一切皆文件也可以认为是一切皆struct file
。Linux设备都会被描述成这种结构。这样通过read
和write
函数调用就可以实现对设备的输入和输出。不同的设备有不同的输入和输出方式,因此这时就可以采用函数指针实现多态,让不同设备有不同的读写方法。
【戒焦戒躁,can win】Linux--IO缓冲区相关推荐
- 【戒焦戒躁,can win】Linux--IO文件描述符
回忆 C 语言文件操作 fopen 当前工作目录 fputs fgets 由 C 文件操作引出的问题 系统级别IO 打开文件 系统级别文件管理 文件构成 文件与进程关联 write底层流水线 read ...
- 【戒焦戒躁,can win】Linux--inode
查看文件属性 认识磁盘 磁盘基本构成 线性存储 inode 和 data block 管理 磁盘文件的创建 磁盘文件的删除 目录和 inode 目录的创建 软硬链接 关于独立的理解 问题产生 提出解释 ...
- 杀入预制菜赛道的陆正耀,还需戒急戒躁
年过半百的陆正耀,开始了他离开瑞幸咖啡后第三次创业. 2020年,瑞幸咖啡自曝财务造假,旋即引发了一连串的连锁反应,其中最大的影响莫过于管理团队的集体下岗,创始人陆正耀也在投资人和董事会的压力下被迫走 ...
- aspose win/linux WORD转PDF(及其解决乱码方式)
aspose win/linux WORD转PDF(及其解决乱码方式) 1.工具类 2.控制台 3.解决乱码 4.JAR包 之前自己用的docm4j 本地进行转换是ok 在服务器中就异常了: 后来在网 ...
- block_dump观察Linux IO写入的具体文件(mysqld)
一.使用方法: 二.基本原理: 三.总结 很多情况下开发者调测程序需要在Linux下获取具体的IO的状况,目前常用的IO观察工具用vmstat和iostat,具体功能上说当然是iostat更胜一筹,在 ...
- 浅析Linux IO
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:0xffffff.org/ 写在前面 在开始正式的讨论前,我 ...
- Linux IO模型漫谈(1)
基础知识 Linux将所有外部设备都看做一个文件来进行操作.因此,linux对所有外部设备的操作都可以看做是文件的操作.文件的操作当然需要有个标示描述它,这就是文件描述符(file descripto ...
- minio下载及安装:win linux平台
minio下载及安装:win linux平台 docker run -p 9000:9000 -v /mnt/data:/data minio/minio server /data minio.exe ...
- linux io阻塞问题
在linux 上 磁盘读写过高 的 I/O 问题 导致 cpu wait 问题,这里是用一些方法找出问题. 首先 使用 top 命令找出 出现 cpu 中 是否进程运行等待问题 # top [cpp] ...
最新文章
- bzoj1717 [Usaco2006 Dec]Milk Patterns 产奶的模式
- python lol脚本_配台电脑,能玩LOL顶配和能够写一些python脚本能用ps不卡,预算6k到8k?...
- 【技术改造】电商系统用户模块集成Feign-2
- rpm mysql 指定目录_rpm 安装并配置MySQL(包含指定数据存储路径)
- 匿名内部类属于局部内部类吗_内部类详解————匿名内部类
- COG云原生优化遥感影像,瓦片切分的应用实践
- ibm量子计算机应用,科学网—IBM量子计算机获重大突破 可进行百万项计算
- canvas画笔功能 Signature Pad
- 【手册】Linux User's Manual
- 运用HTML5进行文字排版详解
- 如何自定义Tomcat 404错误页面
- 安卓app源码和设计报告——简易记账本
- 关于国家计算机二级C程序设计考点
- 机关计算机使用管理制度,机关计算机使用管理制度
- selenium基础八种元素定位
- vue3 实现一个简易版日历
- LVS负载均衡集群介绍(4种工作模式10种调度算法)
- Win7下硬盘安装Linux双系统
- ANSYS Mechanical联合ANSYS nCode DesignLife 在疲劳中的应用
- 七、Kali Linux 2 渗透攻击
热门文章
- Max-Min Fairness带宽分配算法
- 2022世界人工智能大会全记录
- 首都经贸计算机考研怎么样,【考研心路历程】首都经贸大学考研的回忆与感悟...
- NVIDIA TX2 使能CAN模块
- uniapp vue 身份证号校验
- java中long=后面为什么还要加个L
- 如何避免自由软件项目中的需求变更
- U盘图标更改个性化工具
- 用uni.previewImage({}) 来直接做图片的预览和识别二维码
- 共享的快捷方式会经常突然不见_突然爆红的共享自习室,会是一个新风口吗?...