Linux--基础IO(上)

目录

1. 文件的边角知识

1.1 文件是什么?

1.2 文件是怎么打开的?

1.3 进程与文件

进程与文件的关系 

2. 重温c语言文件接口

2.1 打开文件的方式 

2.2 读写文件接口的重温 

2.2.1 写文件 

2.2.2 读文件 

3. 系统文件I/O

3.1 系统接口 

3.2 系统接口的参数详解 

3.3 文件描述符 

3.4 fd的分配规则 

3.5 重定向 

 3.6 dup2


1. 文件的边角知识

1.1 文件是什么?

文件=内容+属性。常说的对文件进行操作,不仅是对文件内容的读写,也有对文件属性的修改。比如修改文件名称,更新文件最新写入时间等。

1.2 文件是怎么打开的?

在linux的命令行界面中,我们打开文件是通过指令打开;在图形化界面中,我们只需要点击文件就可以打开。指令本质是程序,图形化界面点击同样也是一种程序,只不过被封装成了点击的行为罢了,在底层其实没有区别。

访问文件之前需要先打开文件,从上面的叙述中我们明白,文件就是被程序打开的,也即文件的打开工作是进程做的。

为什么呢?为什么不直接让操作系统打开?

文件不能直接被操作系统打开,而是由应用程序通过系统调用来请求操作系统打开文件。  

冯诺依曼体系结构中明确规定,cpu不能与硬件接触。而对文件的处理要靠cpu来运算,但文件存储在磁盘中,因此我们需要将文件加载到内存中才能进行操作,当对文件的修改完成后,将新的文件在磁盘中更新。 

1.3 进程与文件

文件是被进程打开的,但进程能够打开的文件并不只限于一个,即进程与文件是一对多的关系。 

已打开的文件被加载到内存中,那么没有打开的文件呢?在磁盘里。

进程与文件的关系 

我们知道,进程打开后会有一个进程控制块pcb来管理进程。Linux中的pcb被称为task_struct,即管理进程的结构体。文件当然也需要类似的结构体来管理,内核中必然有一个描述被打开文件的结构体,并用其定义对象,我们姑且称他为file_struct。

当进程打开文件后,进程与文件的关系就如下图。

在Linux内核源码中,我们看到在task_struct中包含files_struct结构体,注释为打开文件的信息。 

2. 重温c语言文件接口

2.1 打开文件的方式 

有没有发现一件奇妙的事情,w与输出重定向>功能十分类似,而a则与追加重定向>>类似,r与输入重定向<类似。

2.2 读写文件接口的重温 

2.2.1 写文件 

2.2.2 读文件 

c语言会默认打开三个输入输出流:stdin,stdout,stderr。

我们可以将stdin视作键盘,将stdout视作显示器,stderr视作显示器(输出错误信息)。

我们来看看:

3. 系统文件I/O

3.1 系统接口 

 我们前面说,文件只能被程序通过系统调用来打开,也就是说c语言的文件接口中必定封装着文件操作的诸多系统调用。

我们之前说,c语言会默认打开三个流。注意:这里的FILE*是c语言自己封装的结构体。我们来看看他们是如何封装文件的系统调用 。

下图是我们常用的几个系统调用接口。我们发现,open会返回一个int值fd,其他的接口都会使用这个fd。有没有可能,这个fd就类似于进程的pid,是文件的标识符呢?答案是肯定的。

也就是说,FILE*中封装着文件的标识符fd。

验证:

因此我们可以在系统调用中使用0/1/2来使用键盘/显示器/显示器。 

3.2 系统接口的参数详解 

我们以open接口为例:

下图介绍了flag与mode的常用选项。 

这里的flag传参涉及了位运算传参 ,我们写一段代码来看看。

#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<unistd.h>
#include<string.h>
int main()
{
   size_t fd = open("./log.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);//以只写权限打开,如果文件不存在就创建,存在就清空
   const char* str="hahaha dashagua!";
   write(fd,str,strlen(str));
   close(fd);
    return 0;
}

3.3 文件描述符 

 文件描述符即3.1 中的fd,那么files_struct是如何管理被打开的文件呢?

请看下图,下面的structural flie* fd array[]就是一个指针数组,里面存放着每一个文件结构体的地址,而文件描述符就是数组下标,进程通过文件下标访问文件。

3.4 fd的分配规则 

当我们关闭fd为1的stdout时,此时再打开一个文件log.txt,我们会发现此时我们对1的写入,会写进 log.txt中。这是因为此时打开的文件其fd为1。

如果我们关闭0或2,输出就会是0/2。

文件描述符的分配规则:在files_struct数组当中,找到当前没有被使用的最小的一个下标,作为新的文件描述符。
 

3.5 重定向 

 

我们发现,本来应该输出到显示器上的内容,输出到了文件 myfile 当中,其中,fd=1。这种现象叫做输出
重定向。常见的重定向有:>, >>, <
那重定向的本质是什么呢?

重定向的本质就是改变了文件的输入输出流。
 

针对这一现象,我们有一个系统接口dup2,可以实现重定向的功能。

 3.6 dup2

 接口解释:

代码实验: 

#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<unistd.h>
#include<string.h>

int main()
{
    size_t fd = open("./log.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);
    if(fd<0)
    {
        perror("open error!");
        return 1;
    }
    dup2(fd,1);//重定向,让fd覆盖fd为1的显示器
    write(fd,"hahahah\n",8);//向fd写入,验证并非替换,且fd并未被关闭
    printf("我原本是要输入到显示器的,你看看我现在在哪?\n");//此时fd,1都指向log.txt
    close(fd);
    printf("fd关了,你看看我现在在哪?\n");



    //printf("hello hello!\n");
    return 0;
}

结果展示: 

原理剖析图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/562103.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenVINO安装教程 npm版

从 npm Registry安装 OpenVINO™ 工具套件的英特尔发行版 请注意&#xff1a; 仅提供 JavaScript API 专用于所有主要操作系统的用户&#xff1a;Windows、Linux 和 macOS &#xff08;所有 x86_64 / ARM64 架构&#xff09; macOS 仅支持 CPU 推理 系统要求软件要求 Window…

Python --- 在python中安装NumPy,SciPy,Matplotlib以及scikit-learn(Windows平台)

在python中安装NumPy&#xff0c;SciPy&#xff0c;Matplotlib以及scikit-learn(Windows平台) 本文是针对(像我一样的)python新用户所写的&#xff0c;刚刚在电脑上装好python之后&#xff0c;所需的一些常见/常用的python第三方库/软件包的快速安装指引。包括了这些常用安装包…

【AI自媒体制作】【AI工具】天工AI

链接&#xff1a;天工AI 目前chatgpt3.5已经免费&#xff0c;很多AI平台都可以进行一定层度的白嫖&#xff0c;对于个人开发者是一件好事&#xff0c;有些会员就没必要充值了。 天工AI是比较常见的AI工具了&#xff0c;可以识别图片、智能问答、生成图片等。当然对于一个程序员…

【Linux】git

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解Linux的编译器-gcc/g&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 1.安装git2.在gitee上创建仓库3.首次配置4.下载仓库到本地5.三板斧6.git log7.gi…

【数据结构】二叉爆炸

【数据结构】二叉爆炸 按照惯例整点抽象的&#xff0c;贴上这篇博客的名字由来&#xff1a; 言归正传&#xff0c;本篇博客介绍二叉树的构造方式、前中后序遍历、层序遍历以及代码随想录中二叉树章节的相关题目&#xff1a; 代码随想录 (programmercarl.com) 一、啥是二叉树 …

HDMI to TYPE-C芯片|HDMI2.0转TYPE-C转接器方案|CS5802设计方案|ASL CS5802

CS5802输入端可以是1080P、4K30、4K60HZ这三种规格,输出的接口可以是TYPE-C信号接口,或者是TYPE-C信号接口,输入端HDMI由4路信号组成&#xff0c;支持1.62Gbps、2.7Gbps、5.4Gbps链路速率。内置可选SSC功能可降低EMI的干扰状况。 ASL CS5802芯片概述&#xff1a; 符合HDMI规范…

04节-51单片机-数码管模块

1.静态数码管显示 LED数码管&#xff1a;数码管是一种简单、廉价的显示器&#xff0c;是由多个发光二极管封装在一起组成“8”字型的器件 下图展示了数码管的线路连接 数码管的连接方式分为&#xff0c;公共端&#xff0c;共阴极和共阳极连接&#xff1a; 多个数码管共用引…

IMUGNSS 误差状态卡尔曼滤波器(ESKF)的离散时间的ESKF 运动方程与运动过程

IMU&GNSS 误差状态卡尔曼滤波器&#xff08;ESKF&#xff09;的离散时间的ESKF 运动方程与运动过程 离散时间的ESKF 运动方程ESKF的运动过程 离散时间的ESKF 运动方程 名义状态变量的离散时间运动方程可以写为&#xff1a;&#xff08;不用考虑噪声&#xff0c;噪声在误差…

701强连通分量(python)

看见题目知道时间复杂度不超过&#xff08;mlogm&#xff09;。 这题用强连通分量 Tarjan 算法&#xff0c;强联通&#xff1a;对于任意两个点u和v&#xff0c;u可以到达v&#xff0c;v也可以到达u。这题需要考虑有重边&#xff0c;自环&#xff0c;同样别忘记可能会有两个点u…

[阅读笔记20][BTX]Branch-Train-MiX: Mixing Expert LLMs into a Mixture-of-Experts LLM

这篇论文是meta在24年3月发表的&#xff0c;它提出的BTX结构融合了BTM和MoE的优点&#xff0c;既能保证各专家模型训练时的高度并行&#xff0c;又是一个统一的单个模型&#xff0c;可以进一步微调。 这篇论文研究了以高效方法训练LLM使其获得各领域专家的能力&#xff0c;例如…

idea项目启动异常:Command line is too long.

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; idea中启动项目报错&#xff1a; 解决方案 在idea 的运行配置中&#xff0c;修改enviroment下的shorten command line 为jar manifest 注&#xff1a; 有时shorten command line 可能不是默认存在的…

Linux实验一:NAT、桥接方式的验证

实验名称&#xff1a;在虚拟机中安装RHEL7&#xff0c;验证NAT、桥接上网方式 实验结果&#xff1a; 创建虚拟机 NAT模式 自动获取IP 手动配置IP 桥接模式 自动获取IP 手动配置IP 总结和分析&#xff1a;

我与C++的爱恋:类和对象(四)

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 ​ 朋友们大家好&#xff01;本篇是类和对象的最后一个部分。 一、static成员 声明为static的类成员称为类的静态成员&#xff0c;用static修饰的成员变量&#xff0c;称之…

[阅读笔记29][AgentStudio]A Toolkit for Building General Virtual Agents

这篇论文是24年3月提交的&#xff0c;提出了一个用于agent开发的全流程工具包。 作者提到目前agent开发主要有两个阻碍&#xff0c;一个是缺乏软件基础&#xff0c;另一个是缺乏在真实世界场景中进行评估。针对这两个阻碍&#xff0c;作者涉及了一个开发工具包&#xff0c;包括…

使用立创EDA打开JSON格式的PCB及原理图

一、将PCB和原理图放同一文件夹 并打包成.zip文件 二、打开嘉立创EDA并导入.zip文件 文件 -> 导入 -> 嘉立创EDA标准版/专业版 三、选择.zip文件并选择 “导入文件并提取库” 四、自定义工程路径 完成导入并转换为.eprj文件 五、视频教学 bilibili_使用立创EDA打开JSO…

NLP预训练模型-GPT-3

ChatGPT GPT-3是OpenAI开发的一个自然语言处理&#xff08;NLP&#xff09;预训练模型。GPT代表“生成式预训练变换器”&#xff08;Generative Pretrained Transformer&#xff09;。GPT-3是GPT系列的第三代模型&#xff0c;是一种采用了深度学习技术的强大语言模型&#xff…

驱动开发-windows驱动设计目标

驱动程序和应用程序不一样的&#xff0c;由于其直接运行于windows r0级&#xff0c;故对于开发有更多和更严格的标准&#xff0c;一般会有以下一些常见的设计目标: 安全性、可移植性、可配置性、 可被中断、多处理器安全、可重用 IRP、 支持异步 I/O这些是基本目标。 1. 安全…

【Numpy】对于 Numpy 中 Axis 的理解

文章目录 前言理解轴的两个角度在维度变化方向上计算降维 示例剖析写在最后 前言 Numpy 是 Python 中一个常用科学计算库&#xff0c;常用来表示向量、矩阵以及多维度数组。在 Numpy 中多对某一个维度&#xff08;轴&#xff09;进行相应的操作&#xff0c;这一点经常出错。今…

再论图像变化和频率的关系。

我之前是做了一些探讨&#xff0c;但是没说清楚&#xff0c;现在再看这个问题。 我先提出这个问题。 以以为点列为例&#xff0c;先写成傅里叶级数的形式&#xff0c;不过这里不是三角函数形式&#xff0c;而是指数形式&#xff0c;是一样的。 对f(n)求导&#xff0c;就可以观…

【大语言模型LLM】-使用大语言模型搭建点餐机器人

关于作者 行业&#xff1a;人工智能训练师/LLM 学者/LLM微调乙方PM发展&#xff1a;大模型微调/增强检索RAG分享国内大模型前沿动态&#xff0c;共同成长&#xff0c;欢迎关注交流… 大语言模型LLM基础-系列文章 【大语言模型LLM】-大语言模型如何编写Prompt?【大语言模型LL…