• 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设备都会被描述成这种结构。这样通过readwrite函数调用就可以实现对设备的输入和输出。不同的设备有不同的输入和输出方式,因此这时就可以采用函数指针实现多态,让不同设备有不同的读写方法。

【戒焦戒躁,can win】Linux--IO缓冲区相关推荐

  1. 【戒焦戒躁,can win】Linux--IO文件描述符

    回忆 C 语言文件操作 fopen 当前工作目录 fputs fgets 由 C 文件操作引出的问题 系统级别IO 打开文件 系统级别文件管理 文件构成 文件与进程关联 write底层流水线 read ...

  2. 【戒焦戒躁,can win】Linux--inode

    查看文件属性 认识磁盘 磁盘基本构成 线性存储 inode 和 data block 管理 磁盘文件的创建 磁盘文件的删除 目录和 inode 目录的创建 软硬链接 关于独立的理解 问题产生 提出解释 ...

  3. 杀入预制菜赛道的陆正耀,还需戒急戒躁

    年过半百的陆正耀,开始了他离开瑞幸咖啡后第三次创业. 2020年,瑞幸咖啡自曝财务造假,旋即引发了一连串的连锁反应,其中最大的影响莫过于管理团队的集体下岗,创始人陆正耀也在投资人和董事会的压力下被迫走 ...

  4. aspose win/linux WORD转PDF(及其解决乱码方式)

    aspose win/linux WORD转PDF(及其解决乱码方式) 1.工具类 2.控制台 3.解决乱码 4.JAR包 之前自己用的docm4j 本地进行转换是ok 在服务器中就异常了: 后来在网 ...

  5. block_dump观察Linux IO写入的具体文件(mysqld)

    一.使用方法: 二.基本原理: 三.总结 很多情况下开发者调测程序需要在Linux下获取具体的IO的状况,目前常用的IO观察工具用vmstat和iostat,具体功能上说当然是iostat更胜一筹,在 ...

  6. 浅析Linux IO

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:0xffffff.org/ 写在前面 在开始正式的讨论前,我 ...

  7. Linux IO模型漫谈(1)

    基础知识 Linux将所有外部设备都看做一个文件来进行操作.因此,linux对所有外部设备的操作都可以看做是文件的操作.文件的操作当然需要有个标示描述它,这就是文件描述符(file descripto ...

  8. minio下载及安装:win linux平台

    minio下载及安装:win linux平台 docker run -p 9000:9000 -v /mnt/data:/data minio/minio server /data minio.exe ...

  9. linux io阻塞问题

    在linux 上 磁盘读写过高 的 I/O 问题 导致 cpu wait 问题,这里是用一些方法找出问题. 首先 使用 top 命令找出 出现 cpu 中 是否进程运行等待问题 # top [cpp] ...

最新文章

  1. bzoj1717 [Usaco2006 Dec]Milk Patterns 产奶的模式
  2. python lol脚本_配台电脑,能玩LOL顶配和能够写一些python脚本能用ps不卡,预算6k到8k?...
  3. 【技术改造】电商系统用户模块集成Feign-2
  4. rpm mysql 指定目录_rpm 安装并配置MySQL(包含指定数据存储路径)
  5. 匿名内部类属于局部内部类吗_内部类详解————匿名内部类
  6. COG云原生优化遥感影像,瓦片切分的应用实践
  7. ibm量子计算机应用,科学网—IBM量子计算机获重大突破 可进行百万项计算
  8. canvas画笔功能 Signature Pad
  9. 【手册】Linux User's Manual
  10. 运用HTML5进行文字排版详解
  11. 如何自定义Tomcat 404错误页面
  12. 安卓app源码和设计报告——简易记账本
  13. 关于国家计算机二级C程序设计考点
  14. 机关计算机使用管理制度,机关计算机使用管理制度
  15. selenium基础八种元素定位
  16. vue3 实现一个简易版日历
  17. LVS负载均衡集群介绍(4种工作模式10种调度算法)
  18. Win7下硬盘安装Linux双系统
  19. ANSYS Mechanical联合ANSYS nCode DesignLife 在疲劳中的应用
  20. 七、Kali Linux 2 渗透攻击

热门文章

  1. Max-Min Fairness带宽分配算法
  2. 2022世界人工智能大会全记录
  3. 首都经贸计算机考研怎么样,【考研心路历程】首都经贸大学考研的回忆与感悟...
  4. NVIDIA TX2 使能CAN模块
  5. uniapp vue 身份证号校验
  6. java中long=后面为什么还要加个L
  7. 如何避免自由软件项目中的需求变更
  8. U盘图标更改个性化工具
  9. 用uni.previewImage({}) 来直接做图片的预览和识别二维码
  10. 共享的快捷方式会经常突然不见_突然爆红的共享自习室,会是一个新风口吗?...