基础IO——系统调用文件

news2024/9/23 23:32:21

在这里插入图片描述

文章目录

  • 1. 知识补充和回顾
    • 1.1 回顾C文件接口
    • 1.2 理论理解
  • 2. 系统调用文件接口
    • 2.1 open
    • 2.2 怎么使用
    • 2.3 close和write
    • 2.4 read

1. 知识补充和回顾

1. 文件=文件内容+文件属性。即使创建一个空文件,也会占据磁盘数据。
2. 文件操作=文件内容操作+文件属性操作。在操作文件的过程中,既可能改变内容,又改变属性。
3. 当我们“打开”文件时,会将文件的属性或内容加载到内存中。
4. 是不是所有的文件都处于被打开状态?绝对不是!没有被打开的文件,只存储在磁盘上。
5. 那么文件描述符说的就是打开文件(内存文件),而磁盘文件后面的知识再说。
6. 通常我们打开文件,访问文件,关闭文件,是谁在进行相关的操作?答案是:当我们的文件程序,运行起来的时候,才会执行对应的代码(fopen,fclose,frean,fwrite… …),然后才是真正的对文件进行相关的操作。而这个就是进程

所以,下面我们就要围绕着进程和打开文件的关系来讲解

1.1 回顾C文件接口

大家如果不是太懂C语言文件的可以看这篇文章:C语言文件操作

下面写个小例子:
在这里插入图片描述
我们来看一下运行结果:
在这里插入图片描述
从这个代码中说几个问题:默认生成的这个文件(log.txt)在哪里形成的呢
答案是:当前路径。什么是当前路径呢?
在这里插入图片描述
我们来打印这个进程的pid来查看:
在这里插入图片描述
这个cwd就是当前路径,当前路径也是进程所处的工作路径

我们可以来验证一下:
在这里插入图片描述
我们在这先改变当前的路径。
在这里插入图片描述
我们可以看到cwd已经发生了改变。
在这里插入图片描述
在/home/wyw下生成了log.txt文件。

我们在来看一下:r,r+,w,w+,a,a+这些操作
在这里插入图片描述
先说一下a,这个a的意思是:追加写入,不断的往文件中新增内容
举个例子:
在这里插入图片描述
在这里插入图片描述
w的意思是:如果文件存在就清空,不存在就创建。然后从头写入
在这里插入图片描述
在这里插入图片描述
可以看到log.txt里已经没有内容了。
r的意思是:打开文件从头开始读。文件必须存在

1.2 理论理解

我们知道:我们向文件写入的时候,是向磁盘写入。而磁盘是硬件,只有OS有资格向硬件写入。所以,所有的上层访问文件的操作,都必须贯穿操作系统

那么操作系统是如何被上层访问的
答案是:必须使用操作系统提供的相关系统调用。

那么我们为什么都没有见过这些系统调用接口呢
答案是:因为我们用的所有语言都进行了封装

为什么要封装呢
1.原生系统接口,使用成本比较高
2.语言不具备跨平台性

那么像C语言的封装是如何解决跨平台性的呢?
答案是:穷举所有的底层接口+条件编译

那么像我们使用C库提供的文件访问接口一定会调用系统接口。所以不同的语言有不同的文件访问接口。因此,我们要学习文件级别的系统接口。

2. 系统调用文件接口

2.1 open

在C语言里我们打开文件用的fopen,而在系统调用里是open。
在这里插入图片描述
第一个参数pathname是指向想要打开的文件路径名,或者文件名。我们需要注意的是:这个路径名是绝对路径名。文件名则是在当前路径下的

第二个参数flags是什么意思呢?
在这里插入图片描述
flags参数表示打开文件所采用的操作,我们需要注意的是:必须指定以下三个常量的一种,且只允许指定一个
O_RDONLY:只读模式
O_WRONLY:只写模式
O_RDWR:可读可写

以下的常量是选用的,这些选项是用来和上面的必选项进行按位或起来作为flags参数。
O_APPEND 表示追加,如果原来文件里面有内容,则这次写入会写在文件的最末尾。
O_CREAT 表示如果指定文件不存在,则创建这个文件。

我们先学这5个,还有一些其它的选项我们暂时不关心。那么这些选项其实都是宏。

我们要知道:系统传递标记位,是用位图结构来标记的。每一个宏标记,一般只需要有一个比特位是1,并且和其它宏对应的值,不能重叠。

举个例子:
在这里插入图片描述
我们这里用不同的bit位来标识不同的宏。
在这里插入图片描述
然后我们这里写了一个打印函数,当我们传不同的宏时,就会打印出对应的意义。这个就相当于系统调用的open。
在这里插入图片描述
如果想打印多个,就按位或就行了。
在这里插入图片描述

返回值的意思是:
在这里插入图片描述
open函数的返回值:如果打开文件失败返回-1,否则返回一个大于0的值,表示文件描述符号 (内核用它来读取文件)

2.2 怎么使用

在这里插入图片描述
perror可以根据你的错误码直接打印你的错误码描述。我们可以看一下运行结果:
在这里插入图片描述
可以看到log.txt其实乱码了。原因是:我们创建一个不存在的文件,需要受到Linux权限的约束的。那么你的权限是什么需要告诉Linux。

第三个参数mode表示:设置文件访问权限的初始值,和用户掩码umask有关,也可以用S_IRUSR、S_IWUSR等宏定义按位或起来表示
在这里插入图片描述
我们再看一下运行结果:
在这里插入图片描述
但是这个的权限是664,这就是和umask有关。因为系统默认的掩码是002。如果我们就要设置为666呢?我们需要使用系统调用umask。
在这里插入图片描述
它不仅仅是一个命令,也是一个系统调用接口。
在这里插入图片描述
我们在这里设置umaks为0,这样就会按照我们设置的来创建文件权限。
在这里插入图片描述
1.文件权限由open的mode参数和当前进程的umask掩码共同决定。
2.第三个参数是在第二个参数中有O_CREAT时才作用,如果没有,则第三个参数可以忽略。

2.3 close和write

在这里插入图片描述
这是文件关闭。
在这里插入图片描述
文件的系统调用的写文件只有write一个。第二个参数就是我们要写入文件的首地址,根类型无关。第三个是写入的大小。
在这里插入图片描述
这里的strlen要不要加1呢?答案是:不需要。原因是:系统的调用不认识C语言的\0。
在这里插入图片描述
成功写入log.txt里面了。

在C语言中,以W方式打开文件时,会清空文件。那么在系统调用里呢

在这里插入图片描述
我们按照这样的方式来验证一下:
在这里插入图片描述
但是在系统调用里,并没有清空。原因是:我们缺少一个条件:
O_TRUNC 表示截断,如果文件存在,并且以只写、读写方式打开,则将其长度截断为0
这个选项就是清空,如果我们想像C语言一样,就要加上这个选项。
在这里插入图片描述
运行结果如下:
在这里插入图片描述

那么C语言中的追加也是同样的道理
在这里插入图片描述

2.4 read

在这里插入图片描述
第二个参数是我们要读的内容存到的区域(void 指针可以指向任意类型的数据),第三个参数是要读的大小。返回值是实际读的大小。ssize_t的意思是:有符号的整数。

举个例子:
在这里插入图片描述
运行结果:
在这里插入图片描述

这里可以这样>log.txt快速清空。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

域名+七牛云+PicGo+pypora

域名七牛云PicGopypora 前提准备: 域名(自己的域名)七牛云 免费注册申请10G空间够用picGo 地址pypora (自行下载) GO!!! 七牛云 注册--->登录--->控制台找到对象存储新建…

如何在AndroidStudio中使用GitHub

文章目录1.确认是否安装git2.添加GitHub账户3.创建库4.创建分支5. push内容在项目中肯定要集成版本管理工具,不过有时候更换电脑或者升级AndroidStudio时原来集成的内容就不在了,还在再次集成git。时间长了就容易忘记如何集成Git,因此整理总结…

工作10年我面试过上百个程序员,真想对他们说…

V-xin:ruyuanhadeng获得600页原创精品文章汇总PDF 一、写在前面 最近收到不少读者反馈,说自己在应聘一些中大型互联网公司的Java工程师岗位时遇到了不少困惑。 这些同学说自己也做了精心准备,网上搜集了不少Java面试题,然而实际…

详解c++---内存管理

这里写目录标题c语言在堆上申请空间malloccallocreallocfreec中向堆中申请空间的形式new的介绍delete的介绍new与自定义类型new与malloc的不同定位newoperator new与operator delete函数c语言在堆上申请空间 在之前的学习中我们知道c语言主要是通过malloc free calloc&#xf…

Java基础-常用API的使用方法(Math,System,Runtime,Object,BigInteger,BigDecimal)(1)

1 Math类 1.1 概述 tips:了解内容 查看API文档,我们可以看到API文档中关于Math类的定义如下: Math类所在包为java.lang包,因此在使用的时候不需要进行导包。并且Math类被final修饰了,因此该类是不能被继承的。 Math类…

J - 食物链 POJ - 1182

思路: 首先我们要理清楚三种动物之间的关系,那么可以用A到B的距离为1代表为A吃B, 那么就有下图的关系 那么我们用d1表示吃,d2表示被吃,d3表示是同类 对于另一张图也是符合的 然后我们去找每个点和他的根节点的关系 …

resnet(4)------全连接层与softmax

文章目录1. 全连接层2. SoftMax算法1. 全连接层 全连接层,指的是每一个结点都与上一层的所有结点相连,用来把前面几层提取到的特征综合起来。 举个例子,前面通过卷积和池化层提取出来的特征有眼睛鼻子和嘴巴,那我们能单独通过这…

基于tensorflow的深层神经网络(一)为什么神经网络需要解决非线性和异或问题

参考为什么神经网络需要解决多层和非线性问题 - 云社区 - 腾讯云 维基百科对深度学习的精确定义为“一类通过多层非线性变换对高复杂性数据建模算法的合集”。因为深度神经网络是实现“多层非线性变换”最常用的一种方法,所以在实际中基本上可以认为深度学习就是深度…

音频信号特征

1.声音 音信号是由空气压力的变化而产生的,可以测量压力变化的强度,并绘制这些测量值随时间的变化。 声音信号经常在规律的、固定的区间内重复,每个波都具有相同形状,高度表示声音的强度,称之为振幅。 信号完成一个…

论文笔记-时序预测-FEDformer

论文标题:FEDformer: Frequency Enhanced Decomposed Transformer for Long-term Series Forecasting 论文链接: https://arxiv.org/abs/2201.12740 代码链接: https://github.com/DAMO-DI-ML/ICML2022-FEDformer 摘要 尽管基于变压器的方法…

笔记--Ubuntu20.04安装Nvidia驱动、CUDA Toolkit和CUDA CuDNN

目录 1--安装Nvidia驱动 2--安装CUDA 2-1--禁用nouveau 2-2--选择CUDA Toolkit 2-3--下载和安装CUDA Toolkit 2-4--配置环境变量 2-5--测试是否安装成功: 3--安装CUDA CuDNN 4--测试pytorch能否使用Cuda 1--安装Nvidia驱动 ① 查看可安装的Nvidia驱动版本…

Matplotlib学习笔记(第二章 2.13 Matplotlib中的图形(一))

在这里,您将发现大量示例图,其中包含生成它们的代码。 线图(Line Plot) 下面是如何使用plot()创建带有文本标签的线图。 Fig. 1: Simple Plot 多个绘图区域(Multiple subplots in one figure) 多个绘图区域由subplot()函数创建: Fig. 2:…

【小程序】内容滚动方案,视频或者照片上方不随滚动而滚动

💭💭 ✨:内容滚动方案,视频或者照片上方不随滚动而滚动   💟:东非不开森的主页   💜: 优于别人,并不高贵,真正的高贵应该是优于过去的自己。——海明威💜&a…

【图像去噪】基于自适应滤波器消除椒盐噪声图像附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

web前端课程设计(HTML和CSS实现餐饮美食文化网站)静态HTML网页制作

👨‍🎓静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计👩‍🎓,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等,用的最多的还是DW,当然不同软件写出的…

论文笔记-时序预测-Informer

论文标题: Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting 论文链接: https://arxiv.org/abs/2012.07436 源码链接: https://github.com/zhouhaoyi/ETDataset 摘要 许多实际应用都需要对长序列时间序列…

游戏开发55课 性能优化12

4.9 带宽优化 带宽优化的目的是减少CPU与GPU之间的数据传输。 4.9.1 LOD(Level Of Detail) LOD即细节层次,根据物体在画面的大小选用不同级别的资源,以减少渲染和带宽的消耗。LOD在图形渲染中应用广泛,适用的对象有…

au cs6七线阁教程 笔记

01 驱动 asio 02 I 监听 R录音 一般是单声道 03 调整音量声相 04 导出 删除轨道文件 07 删除选区 自定义波形剪辑颜色 录音激活后,监听才能激活 08 自动控制 默认控制音量: 09 效果器: Vst3 dll 插件 独立效果器面板,实时&a…

[附源码]Python计算机毕业设计SSM基于框架预约挂号系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【leetcode】对称二叉树

一、题目描述 给你一个二叉树的根节点 root , 检查它是否轴对称。 输入:root [1,2,2,3,4,4,3] 输出:true 示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false 二、代码思路 详细题解地址 思路有…