Linux6.2、IO基础(文件系统接口)

个人主页:Lei宝啊 

愿所有美好如期而遇


直接使用系统接口

fopen底层封装的系统接口为open

pathname也就是文件路径,flags我们通过一个demo来理解。

首先我们应该了解的是位图,int有32个比特位,我们根据他的比特位是否为1来决定这个位我们是否使用,而我们的flags就是应用了位图来代表打开文件的方式,C库函数我们使用r,w,a等方式打开文件,而系统接口就没这么简单了,我们看下图:

O_RDONLY表示只读,O_WRONLY表示只写,O_RDWR表示读写,而且这三个我们必须包含一个,O_APPEND表示追加,O_CREAT表示创建,O_TRUNC表示清空文件。

我们发现他们都是大写的,这也就代表他们是个宏,我们来尝试看一下:

接下来我们来看demo:

所以我们的flags该怎么用呢?

我们先删除log.txt文件,我们希望以w方式打开文件,如果不存在则创建。

同时我们了解一下fclose的底层,方便我们演示后关闭文件,close参数就是open的返回值,这里先说这么多,后面细说。

我们的文件呢?我们不是以写的方式打开的吗?库函数做一步的工作,系统函数一步可完成不了,O_CREAT创建选项是不是没加呢?我们加上

我们创建出了文件,但是他的权限好像和我们touch出来的不一样,而且还标红了,所以我们还是少了东西,少了什么呢?

我们这个时候就需要使用带mode参数的open函数了,他代表着权限,我们传八进制。

0666,写成二进制就是110110110对应着rw-rw-rw-但是我们发现最后other所属组权限没有写,这就是因为umask掩码。

我们可以在函数里设置当前进程所要设定的掩码,不会影响到整个bash。

我们创建文件时需要路径,绝对路径或者相对路径,我们要在当前路径下创建文件,那么系统怎么知道当前路径是什么?根据可执行程序路径?源代码路径?或者是进程路径?我们来测试一下:

cwd指向的也就是我们进程的当前工作路径,exe指向我们可执行程序的路径,我们也就知道了创建文件当前路径的位置也就是进程所在路径。

综上所述我们也就可以体会到为什么要使用库函数的原因之一,就是因为难度,初学者使用系统调用的难度确实很高,让你初学C语言时包含一堆看不懂的头文件,以及学习位图的理解,涉及到系统的知识,会不会直接劝退~。

当然,我们的w打开文件方式还没有复现完全,缺少O_TRUNC清空,但是现在,这很简单不是吗?包括追加,相信也不是什么难事,所以不做演示。

fwrite底层封装的系统接口为write 

fread底层封装的系统接口为read

 fclose底层封装的系统接口为close

实现cat  

本节我们使用了不少fd,但是没有解释什么是fd,我们下节将会引入fd,以及分析系统接口的细节,我们下节见!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 fixture 机制重构 appium_helloworld

一、前置说明 在 pytest 基础讲解 章节,介绍了 pytest 的特性和基本用法,现在我们可以使用 pytest 的一些机制,来重构 appium_helloworld 。 appium_helloworld 链接: 编写第一个APP自动化脚本 appium_helloworld ,将脚本跑起来 代码目录结构: pytest.ini 设置: [pyt…

图像质量评估方法——结构相似性指数(SSIM)

结构相似性指数(SSIM)是一种全参考图像质量评估方法,用于比较两幅图像的相似性。 SSIM的计算涉及到亮度(Luminance)、对比度(Contrast)和结构(Structure)三个方面的相似性…

Docker 安装 MySQL5.7 和 MySQL8

文章目录 安装 MySQL5.7拉取镜像前期准备:启动容器 安装MySQL8.0拉取镜像查看镜像前期准备启动容器 安装 MySQL5.7 拉取镜像 docker pull mysql:5.7拉下来镜像后 执行 docker images 此时我们已经有这个镜像了。 前期准备: 在根目录下创建 app &…

PTA 最小生成树-kruskal

7-92 最小生成树-kruskal 分数 10 全屏浏览题目 作者 任唯 单位 河北农业大学 题目给出一个无向连通图,要求求出其最小生成树的权值。 温馨提示:本题请使用kruskal最小生成树算法。 输入格式: 输出格式: 输出一个整数表示最小生成树的各边的长度之和。…

Redis缓存常见问题之预热、雪崩、击穿、穿透

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术🔥如果感觉博主的文章还不错的…

Ubuntu 22.04.3 Server 设置静态IP 通过修改yaml配置文件方法

目录 1.查看网卡信息 2.修改yaml配置文件 3.应用新的网络配置 4.重新启动网络服务 文章内容 本文介绍Ubuntu 22.04.3 Server系统通过修改yaml配置文件配置静态 ip 的方法。 1.查看网卡信息 使用ifconfig命令查看网卡信息获取网卡名称​ 如果出现Command ifconfig not fo…

单聊和群聊

TCP协议单聊服务端: import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Vec…

MySQL的替换函数及补全函数的使用

前提: mysql的版本是8.0以下的。不支持树形结构递归查询的。但是,又想实现树形结构的一种思路 提示:如果使用的是MySQL8.0及其以上的,想要实现树形结构,请参考:MySQL数据库中,如何实现递归查询…

4个杀手级 Pycharm 高效插件

Pycharm是Python最受欢迎的集成开发环境之一。它具有良好的代码助手、漂亮的主题和快捷方式,使编写代码变得简单快捷。 话虽如此,开发者仍可以通过使用一些插件来提高在Pycharm中编写Python代码的效率和乐趣。在市场上,Pycharm有很多免费的插…

【MYSQL】MYSQL 的学习教程(六)之 SQL 语句执行流程

1. 一条 SQL 查询语句是如何被执行的 MySQL 的基本架构示意图如下所示: MYSQL 线程处理请求流程: SQL 接口:MySQL 中处理请求的线程在获取到请求以后获取 SQL 语句去交给 SQL 接口去处理查询解析器:解析器会将 SQL 接口传递过来…

数据结构与算法基础

数组 稀疏矩阵 题目 代入法选A 数据结构的定义 线性表 顺序存储和链式存储的对比 队列与栈 题目 答案选:D 广义表 树与二叉树 二叉树遍历 图中前序遍历结果是? 1,2,4,5,7,8,3,6 图中中序遍历结果是? 4,7,8,5,2,1,3,6 图中后序遍历结果是…

跨界于自然语言处理的广泛应用领域

目录 前言1 图灵测试和Imitation Game2 基于数据的NLP应用3 Google搜索引擎与在线广告的机制4 知识图谱:连接现实世界的实体5 智能音箱(虚拟助手)的交互能力6 机器翻译:连接全球多语言7 情感分析和意见挖掘8 社会学研究与文化分析…