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

Linux基础IO--重定向--缓冲区

1,为什么语言喜欢做封装?

我们先知道一个概念,显示器叫做字符设备,根据ACSLL码来打印数据,所以我们从键盘输入的

1234,在显示器看来就是一个一个的字符('1','2','3','4')而不是一千两百三十四:

 下图输入字符类型数据:

下图输入int类型数据:

可以看到,要是输入int类型数据到显示器里,就会被解析成另外一个字符,不能如我们所愿的打印出1234,我们需要将输入的int类型值格式化之后才能向显示器输出:

所以为什么c中有printf?为什么又write还要printf?

因为要把内存级别的数据转成字符串,再用write打印到显示器,如果这些全程交给程序员来做不做封装,就会降低程序员的工作效率,这就是c/c++为什么提供fput等io接口的原因之一。

键盘输入数据也是以字符串的方式输入。

如果直接用read读出来的是字符串,如果要的是1234数字而不是字符串,就有c封装的scanf(“%d”,&a);,和上面的代码模板类似:buffer ---> %d ---> &a;

所以c/c++为什么要封装?

1,为了方便用户操作

因为在操作系统中无文本的概念,只有二进制,但在语言层,就转化成用户可看的:

例子就是./text,text.c变成可执行文件的过程就是把代码编译成二进制文件。

2,提高语言的可移植性

Linux,win ,macos底下都有不同的系统调用接口,printf就封装了这三种接口的方法,如果是在Linux中用printf他就会调用Linux的接口,如果在win中用就调用win接口。

2,IO的基本过程

1,缓冲区

write本质其实是拷贝函数,从用户拷贝到缓冲区:

然后再由os自主决定什么时候刷新到外设:

外设可以以预加载到缓冲区:

每个函数都有自己的操作表,里面是函数指针的合集,指向文件内核缓冲区。

修改的本质也是先读取在写入。

为什么要存在缓冲区?

因为磁盘很慢,内存很快,缓冲区的存在变相提高了效率。

同时这就是我们平时写东西的时候没按保存,缓冲区没把数据刷到磁盘,断点的时候我们写的东西就不会被保存而被刷掉。

2,重定向

我们在打开文件的时候,把0关掉会怎么样?:

可以看到,0号关了之后就会被新创建的表占用:

那么把2关掉会怎么样:

     

把2关掉首创建的文件就会把2占用,如果把1关了会怎么样?

把1关了相当于把显示器输出关了,printf不知道哦我们关了一号文件,printf就无法把内容输入到显示器,根据我们之前的理解,这个时候printf应该会向一号文件中写入我们要输出的东西:

事实证明文件里什么都没有,为什么呢?

因为写入的内容在缓冲区中没刷新到文件里,程序推出后缓冲区清空,写入的内容消失,这时候需要用fflush刷新到文件中:

可以看到,数据已被刷入文件。

那么本来应该向显示器文件写入的,却写到了文件中?

也就是改变了一号指向显示器的文件,改到了指向其他文件,这就是重定向了!

重定向的过程中,上层代码毫不知情,他们只认识0,1,2.

那么有无接口直接重定向而不是这样关闭打开操作太麻烦了?

dup2!

如果不理解之前文件描述符等等的学习经历,就无法理解为什么dup2里传1,2就可以重定向?

只有学习里,才知道里面1,2的作用,才能理解dup2,

重定向之后,被覆盖的文件如果没有其他指针指向,就会自动关闭文件。

覆盖的文件如果没有关掉之前老地址的指向,就会有两个指针指向该文件。

操作:

     

什么是追加重定向?就是open里面的是O_APPEND,而不是O_TRUNC.

与重定向的方法无不同,只是打开方式不同。

什么是输入重定向?

将键盘的位置和文件换一下,就变成了直接从文件中读内容。

重定向之后很少恢复,入宫需要恢复可以在重定向之前存好需要被重定向的文件。

     


http://www.kler.cn/news/367651.html

相关文章:

  • 记录下docker部署gitlab-ce-17.5版本及客户端git拉取方式配置
  • redis高级篇之IO多路复用select方法简介 第174节答疑
  • blender 小车建模 建模 学习笔记
  • QT仿QQ聊天项目,第一节,创建项目并布置编辑登录界面
  • axure中继器
  • UI管理器的使用
  • 30. 串联所有单词的子串 C#实现
  • pip在ubuntu下换源
  • Android Studio超级详细讲解下载、安装配置教程(建议收藏)
  • 探索CSS动画下的按钮交互美学
  • MySQL 的元数据锁(Metadata Locks, MDL)原理详解
  • Python 协程详解----高性能爬虫
  • 适用在汽车诊断系统中的总线收发器芯片选型:CSM9241
  • Android AAR嵌套AAR打包出现问题解决方案
  • 自由学习记录(15)
  • 前端SSE-EventSource message事件执行异常问题
  • TypeScript(中)+算法(二)
  • 道可云人工智能元宇宙每日资讯|《嘉兴市推动人工智能高质量发展实施方案》发布
  • C/C++ 每日一练:二分查找
  • 【网络协议栈】Tcp协议(上)结构的解析 和 Tcp中的滑动窗口(32位确认序号、32位序号、4位首部长度、6位标记位、16为窗口大小、16位紧急指针)
  • apply call bind 简介
  • 设计模式06-结构型模式1(适配器/桥接/组合模式/Java)
  • 理解LSTM
  • 【视频混剪Demo】FFmpeg的使用【Windows】
  • codeforces _ 补题
  • 数据可视化视频制作