Linux----缓冲区

这里写目录标题

  • [<font color="FF00FF">1. ./a.out 1>log.txt](#1. ./a.out 1>log.txt)
  • [<font color="FF00FF">2. 理解操作系统一切皆文件](#2. 理解操作系统一切皆文件)
  • [<font color="FF00FF">3. 缓冲区](#3. 缓冲区)
  • [<font color="FF00FF">4. 内核源代码FILE](#4. 内核源代码FILE)

1. ./a.out 1>log.txt

前两句话是向标准输出里打印,后两句话是向标准错误里打印,但其实都是向标准输出里打印,使用引用计数而已

但是这里可以看到这里重定向后,只是把文件描述符1位置的指针指向变了,2并没有变,因为默认就是./a.out 1 >log.txt,只是我们不写1,默认就是1



为什么要有标准错误?(printf/perror,cout/cerr)

主要是为了可以使用重定向的能力,把常规消息和错误消息分离

这种方式可以把标准输出和标准错误打印到同一个文件里面,就是把1里的内容拷贝到2里

2. 理解操作系统一切皆文件


上图中的外设,每个设备都有自己的read、write,但⼀定是对应着不同的操作方法,但通过struct file 下 file_operation 中的各种函数回调,让我们开发者只用file便可调取Linux系统中绝大部分的资源!!这便是"linux下⼀切皆⽂件"的核心理解

内核源代码

3. 缓冲区


这里的代码和运行结果没有任何问题

一旦在return 0前面再加上close(fd),此时就会变成

因为此时是向log.txt写入,而用户级缓冲区没满所以不会刷新到文件内核缓冲区,但是write系统调用可以把内容写到文件内核缓冲区,之后又把fd关闭了,此时没有任何文件和这个fd关联,所以等进程退出时,printf只认文件描述符1,但此时已经不能向文件打印消息了


.因为/a.out是向显示器文件写入,所以行刷新,四条消息都打印出来了,而向log.txt文件写入时,在fork的时候,那三条消息还在缓冲区里,因为缓冲区没满不会刷新,fork完成后,父子进程各自刷新,而write是直接向内核缓冲区写入的,不存在用户向内核刷新的问题

缓冲区就是内存的一段空间,c标准库的FIle结构体里存在用户级语言层缓冲区还有fd

4. 内核源代码FILE

typedef struct _IO_FILE FILE; 内核把它重命名了

相关推荐
凡人叶枫3 小时前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发
云栖梦泽3 小时前
玩转RK3506SDK
linux·嵌入式硬件
极客先躯3 小时前
高级java每日一道面试题-2026年02月01日-实战篇[Docker]-Docker Volume 的生命周期管理是怎样的?
java·运维·docker·容器·持久化·架构图·容器卷
Java面试题总结3 小时前
Linux-Ubantu-贴士-apt的地盘
linux·运维·服务器
●VON3 小时前
AtomGit Flutter鸿蒙客户端:数据模型
android·服务器·安全·flutter·harmonyos·鸿蒙
志栋智能3 小时前
超自动化巡检:提升MTTR,缩短业务影响时间
运维·自动化
酉鬼女又兒4 小时前
零基础入门计算机网络:网络层核心任务、三大关键问题、两种服务类型与 TCP/IP 网际层协议体系全解析
服务器·网络·网络协议·tcp/ip·计算机网络·php·求职招聘
kong@react4 小时前
Rocky Linux 10.2 全面解析:企业级 CentOS 替代方案及保姆级docker安装
java·linux·运维·docker
Gauss松鼠会4 小时前
【GaussDB】GaussDB重要通信参数汇总
服务器·网络·数据库·sql·性能优化·gaussdb·经验总结
凡人叶枫4 小时前
Effective C++ 条款07:为多态基类声明 virtual 析构函数
linux·c语言·开发语言·c++