Linux---文件(1)---初识文件

目录

预备知识

文件操作接口

打开文件接口

重定向与文件操作关系

"w"方式与重定向

“a”方式与追加重定向

写入文件接口

读取文件接口

系统调用接口

参数解析


预备知识

我们知道,创建出一个空文件也要在内存中占空间。

文件=文件内容+文件属性

操作文件本质就是操作文件内容或文件属性。

我们在访问文件之前,都需要用编辑软件先打开这个文件,操作文件本质都是通过执行代码的方式完成操作的,都是通过被CPU处理来完成的。所以,文件在操作之前必须创建进程、将文件加载到内存中,让CPU去调度这个进程来完成文件操作。文件本质是被进程打开的

进程可以打开多个文件。

在某一时间段内,系统中存在多个进程,也可能同时存在更多的被进程打开的文件,操作系统要管理这些被多个进程打开的文件,就需要"先描述,再组织"。

内核中一定要有描述被打开的文件的结构体,并定义其对象管理每个被进程打开的文件,并将其节点以某种数据结构连接。此后,对打开文件的管理就变成了对某种数据结构的增删查改了。

操作这个文件是通过操作系统执行对应的系统调用接口来实现的。

系统没有将磁盘中的所有文件都打开,被进程打开的文件在内存中称为内存文件,没有被进程打开的文件在磁盘中称为磁盘文件。

文件操作接口

打开文件接口

重定向与文件操作关系

"w"方式与重定向

“a”方式与追加重定向

总结一下

重定向操作的前提是先打开此文件,本质是向文件内做写入操作。

重定向>时,本质是先以"w"方式打开(会提前自动清空),然后再写入。

追加重定向>>时,本质是将文件以"a"方式打开,从文件结尾处开始追加写入。

写入文件接口

进程在启动时,会自动记录自己启动时所在的目录路径,默认将当前目录路径存储在/proc/进程pid这个文件夹中的cwd连接文件中。

如果需要修改,则需要使用chdir接口。

cwd文件记录当前目录路径,我们在使用fopen接口的时候,默认就是在当前目录下打开文件,就是借助了cwd文件,由cwd文件和fopen接口的第一个参数进行拼接为绝对路径来寻找文件。

读取文件接口

在执行文件写入操作过程中,首先创建指定的空文件(文件存在就不创建),由操作系统写入到内存(缓冲区)中,执行到文件退出时,再由操作系统将缓冲区的内容刷新到磁盘文件中。

程序在启动时,会默认打开三个文件流,stdin、stdout、stderr。

extern FILE *stdin;  //标准输入流
extern FILE *stdout; //标准输出流
extern FILE *stderr; //标准错误流

操作系统设计者在设计的时候,考虑到用户从何处输入数据、将输出信息输出到何处、遇到错误之后将错误记录到何处。基于这样的考虑和人们使用这三个文件频率足够高,所以设计成程序启动时默认打开,程序退出时默认关闭。

如果程序默认不帮我们打开这三个文件流,那么我们在做指定操作的时候,就需要打开指定的文件流。比如:我们在输入的时候,就要提前打开stdin文件流,才能进行输入操作。

程序在启动时,这三个文件被默认打开,可以直接使用,我们使用对应的接口时(sacnf/printf)内部一定是对这三个文件进行操作。一般来说可以认为显示器文件就是stdout、键盘文件就是stdin。键盘、显示器都是硬件,我们对其进行读写操作时,底层必须使用操作系统提供的系统调用接口,完成从上层到底层硬件的操作过程。

系统调用接口

访问文件不仅仅有语言上的访问文件接口,操作系统必须要提供对应的访问文件的系统调用接口。

参数解析

const char *pathname:文件所在路径

int flags:文件打开方式

O_RDONLY:只读模式 
O_WRONLY:写方式
O_RDWR  :读写方式
O_CREAT :若文件不存在就创建
O_TRUNC :写入之前清空文件
O_APPEND:从文件结尾处开始追加写入

采用open系统调用,以O_WRONLY方式写入时,如果当前目录下没有该文件,就会报错。

如果不存在就创建则需要带上O_CREAT参数,但创建出来的文件的权限为会出现乱码现象,所以就需要第三个参数mode_t mode(文件起始权限)。

mode_t mode:文件起始权限

mode参数是起始权限会被umask过滤为最终权限,mode格式为0xxx(xxx为八进制权限数字)。

但是,我们如果不想使用系统的umask,想为此进程自定义一个umask,就需要使用umask接口。

在系统层面,每一个文件都有一个特有的文件描述符,通过这个文件描述符来控制文件,对此文件操作都是借助文件描述符。

需要在写入之前做一下清空,就需要带上O_TRUNC选项。

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

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

相关文章

网络安全服务基础Windows--第12节-域与活动目录

工作组 在Windows环境中配置⼯作组相对简单,适合⼩型⽹络环境,如家庭或⼩型办公室⽹络。⼯作组通过简单的⽹络共享和本地管理来实现资源共享,⽽不依赖于中央控制的服务器。 ● 定义:⼯作组是⼀种对等⽹络模型,在这种…

总结一下windows电脑字体模糊的优化方案

问题:谷歌浏览器上页面显示的字体非常细,有点费眼睛了👾 解决方案: 方案1:手动调整ClearType文本。方案2:英伟达显卡控制面板->管理3d设置->关闭全局平滑FXAA(如果某个软件需要使用平滑处…

【vue css】background设置背景图片不显示问题

问题: 如上图所示,添加背景图片页面没有显示 解决: 添加background-position: center center 即可显示 但是不知道为什么添加这个属性就可以,求大神解惑

出现 /www/server/mysql/bin/mysqld: Shutdown complete 的解决方法

目录 1. 基本知识1.1 查找my.cnf目录1.2 配置错误日志2. 问题所示3. 原理分析4. 解决方法1. 基本知识 主要补充一些基本知识的拓展 1.1 查找my.cnf目录 查看mysql默认读取my.cnf的目录: mysql --help|grep my.cnf 截图如下:(为了方便查看具体使用的配置文件在哪个路径)…

数据库悲观锁和乐观锁的区别

前言 MySQL本身不直接提供悲观锁(Pessimistic Locking)和乐观锁(Optimistic Locking)的实现机制,因为这些锁的概念通常是在应用层面通过不同的策略和工具来实现的。然而,我们可以利用MySQL的一些特性来模拟…

泰克THDP0100(Tektronix)thdp0100高压差分探头详情资料

泰克 THDP0100 高压差分探头具有较大的差分动态范围功能,为用户提供了安全的高压测量探头解决方案。每个探头都配有两种尺寸的钩尖,并具有超范围视觉和声音指示器,当用户超出探头的线性范围时会发出警告。泰克 THDP0100 探头配备 TEkVPI 接口…

实训day42(9.3)

⼀、编排分类 单机容器编排: docker-compose 容器集群编排: docker swarm、mesosmarathon、kubernetes 应⽤编排: ansible(模块,剧本,⻆⾊) ⼆、系统管理进化史 1. 传统部署时代 早期,各个组织是在物理服务器上运⾏应⽤程序。 由于⽆法限…

【Linux】倒计时|进度条|git|gdb的实现

目录 一、缓冲区 1.缓冲区概念: 2.缓冲区作用: 3.缓冲区刷新策略 4.缓冲区位置 5.总结 二、实现倒计时 三、进度条版本1️⃣ 四、进度条版本2️⃣ 五、使用git命令行 六、Linux调试器-gdb使用 背景 开始使用 一、缓冲区 1.缓冲区概念&…

如何提升网站权重?

提升网站权重的方法有很多,常规的方法包括内容优化、关键词研究、页面结构调整、提高用户体验等。但这些方法往往需要时间来见效。如果你希望在短时间内看到显著的提升,发外链是一个非常有效的策略。 外链是提升网站权重的有效方法,但需要注…

【Transformer】Tokenization

文章目录 直观理解分词方式词粒度-Word字粒度-Character子词粒度-Subword(目前最常使用) 词表大小的影响参考资料 直观理解 在理解Transformer或者大模型对输入进行tokenize之前,需要理解什么是token? 理工科的兄弟姐妹们应该都…

无人机+应用综合实训室解决方案

随着无人机技术的飞速发展,其在航拍、农业、环境监测、物流运输等多个领域展现出巨大的应用潜力。为了满足职业院校及企业对无人机应用技术型人才的培养需求,唯众紧跟市场趋势,推出了全面且详尽的《无人机应用综合实训室解决方案》。本方案旨…

TeamTalk路由服务器

路由相关信令和协议设计 enum BuddyListCmdID {// ...... 暂时省略无关信令CID_BUDDY_LIST_USERS_STATUS_REQUEST 522,CID_BUDDY_LIST_USERS_STATUS_RESPONSE 523,// ...... 暂时省略无关信令 };message IMUsersStatReq{//cmd id: 0x020arequired uint32 user_id 1;repeat…

python 正则表达式“.*”和“.*? ”的区别

“.*”和“.*? ”的区别 点号表示任意非换行符的字符,星号表示匹配它前面的字符0次或者任意多次。所以“.*”表示匹配一串任意长度的字符串任意次。这个时候必须在“.*”的前后加其他的符号来限定范围,否则得到的结果就是原来的整个字符串。 “.*? &…

“软件即仪器”——全新架构 Xtreme Vision显微测量软件平台

“软件即仪器”,工业测量软件较为复杂,涵盖了软件架构、信号处理、图像处理、数值计算、空间几何、三维建模、3D渲染、并行计算、人机交互等多种交叉软学科,是测量仪器系统极为重要的组成部分,中图仪器一直致力于自主化工业测量软…

使用AI写WebSocket知识是一种怎么样的体验?

一、WebSocket基础知识 1. WebSocket概念 1.1 为什么会出现WebSocket 一般的Http请求我们只有主动去请求接口,才能获取到服务器的数据。例如前后端分离的开发场景,自嘲为切图仔的前端大佬找你要一个配置信息的接口,我们后端开发三下两下开…

使用 Spring Cloud 有什么优势?

使用 Spring Cloud 有什么优势? 1. 简化复杂性2. 服务发现与注册3. 负载均衡4. 冗余与容错5. 性能与部署6. 生态系统与社区 💖The Begin💖点点关注,收藏不迷路💖 在微服务架构的浪潮中,Spring Cloud凭借其简…

传统CV算法——基于Opencv的多目标追踪算法

基于 OpenCV 的跟踪算法有多种,每种算法都有其特定的应用场景和优缺点。以下是一些常见的基于 OpenCV 的目标跟踪算法: 1. BOOSTING 跟踪器 描述:基于 AdaBoost 算法的跟踪器。它是一种早期的跟踪算法,使用的是基于弱分类器的强…

【数据结构篇】~链表算法题2

链表算法题2 1.返回倒数第k个节点思路解析 2.链表的回文结构​思路解析1(空间复杂度不符合)解析2 3.相交链表​思路解析 1.返回倒数第k个节点 OJ链接 思路 有点像高中学的相对位移 利用快慢指针,开始时都指向头节点,然后让快指…

VMware虚拟机安装的Ubuntu,桥接方式静态ip,内网可以访问,ping外网不可用

1.环境说明 系统:Ubuntu 24.04 环境:VMware下桥接静态IP设置 2.问题:ping www.baidu.com报错 [~] ping www.baidu.com ping: www.baidu.com: Temporary failure in name resolutio…

php邮箱服务器怎么搭建?如何构建服务器?

php邮箱服务器配置教程指南?php邮件服务器如何搭建? 搭建一个稳定高效的php邮箱服务器,不仅可以提升邮件传输的效率,还能增强数据的安全性。那么,如何着手搭建这样一个服务器呢?AokSend将详细探讨php邮箱服…