Linux学习笔记:什么是文件描述符

什么是文件描述符

  • C语言的文件接口
  • 文件的系统调用
    • 什么是文件描述符,文件描述符为什么是int类型?
    • 为什么新打开的文件的文件描述符不是从0开始?

文件描述符 fd (file descriptor)

C语言的文件接口

当时学习C语言的时候,学习了文件接口
具体可以查看之前的文章: 链接:C语言的文件操作 http://t.csdnimg.cn/H6oAH
举例:

 #include<stdio.h>

int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "w");  //以只写的方式打开/创建文本文件
	if (pf == NULL)   //判定是否打开成功,当打开文件失败时,fopen函数会返回空指针
	{
		perror("fopen"); 
		return 1;
	}
	// 写文件

	//关闭文件
	fclose(pf);
	pf = NULL; //用完指针后置空

	return 0;
}

而文件的打开方式及意义是重点:

文件使用方式含义如果指定文件不存在
“r”(只读)为了输入数据,打开一个已经存在的文本文件出错
“w”(只写)为了输出数据,打开一个文本文件建立一个新的文件
“a”(追加)向文本文件尾添加数据建立一个新的文件
“rb”(只读)为了输入数据,打开一个二进制文件出错
“wb”(只写)为了输出数据,打开一个二进制文件建立一个新的文件
“ab”(追加)向一个二进制文件尾添加数据出错
“r+”(读写)为了读和写,打开一个文本文件出错
“w+”(读写)为了读和写,建立一个新的文件建立一个新的文件
“a+”(读写)为了读和写,在文件尾进行读写建立一个新的文件
“rb+”(读写)为了读和写,打开一个二进制文件出错
“wb+”(读写)为了读和写,建立一个新的二进制文件建立一个新的文件
“ab+”(读写)打开一个二进制文件,在文件尾进行读写建立一个新的文件

但是上面的接口,只是单纯的C语言写出来对文件进行调用和操作的
而对文件(即磁盘)进行操作的权力实际上只有操作系统,实际上C语言是封装了操作系统的系统调用

FILE 是一个C语言提供的结构体类型

文件的系统调用

上面讲到,C语言的文件操作函数实际上是封装了系统调用,实际上调用的就是open函数;
在这里插入图片描述

参数解析:
 pathname: 要打开或创建的目标文件
 flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。
 
参数:
 O_RDONLY: 只读打开
 O_WRONLY: 只写打开
 O_RDWR : 读,写打开
 这三个常量,必须指定一个且只能指定一个
 
 O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
 
 O_APPEND: 追加写
返回值:
	打开成功,返回对应的文件描述符
	打开失败,返回 -1

可以看到,open函数的返回值是一个int类型,这个返回值就是操作系统想要得到的文件描述符

什么是文件描述符,文件描述符为什么是int类型?

在操作系统中,每个进程都可能会打开多个文件,那么操作系统就需要对这些多个文件进行管理,因此操作系统会在这个进程的PCB中创建一个专门管理文件的结构体struct files_struct *files,而这个结构体中又包含了一个结构体指针数组,这个数组的下标就是文件描述符
如图:
在这里插入图片描述

而我们所知道的文件描述符,实际上就是对文件管理pcb中文件描述符结构体指针数组这个数组的下标,让操作系统明白我们调用的是这多个文件中的哪一个文件

为什么新打开的文件的文件描述符不是从0开始?

因为Linux下一切皆文件,因此每当创建一个进程的时候,操作系统默认会打开三个文件:

  1. 标准输入(stdin) 键盘 (描述文件符 0)
  2. 标准输出(stdout) 显示器 (描述文件符 1)
  3. 标准错误(stderr) 显示器 (描述文件符 2)

这三个文件占用了文件描述符数组的前三位,因此每当我们创建一个进程后,打开的每一个文件的文件描述符都是从3开始的

因此,各种语言 如C/C++,Java,python 等等,对文件的操作基本都是对系统调用函数open 进行的封装,因为操作系统与语言无关,无论什么语言,想要在操作系统下跑起来,那就得遵守这个操作系统的规矩,而文件调用这里的规矩,就是去封装open这个系统调用!

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

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

相关文章

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Select)

提供下拉选择菜单&#xff0c;可以让用户在多个选项之间选择。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Select(options: Array<SelectOption>) 参数&#xff1a;…

Autosar教程-Mcal教程-Fls配置教程

3.11.1 FLS基础知识 flash操作中有两个术语:block和page。block是flash最小的擦除单位,page则是flash写入的最小单位。以我们使用的F1KM-S4(R7F7016533)来说,它的是64 bytes, page是4bytes。这也就意味着,如果要擦除的话,最小要擦除64 bytes,但是写入可以按4字节的大小写入…

SketchUp Pro 2023 for Mac/Win:重塑设计,引领未来

在数字化浪潮席卷全球的今天&#xff0c;设计行业也迎来了前所未有的变革。SketchUp Pro 2023&#xff0c;这款专为设计师打造的草图大师软件&#xff0c;正以其强大的功能和卓越的性能&#xff0c;引领着设计界的新潮流。 SketchUp Pro 2023不仅继承了前代产品的优秀基因&…

【Java设计模式】二十三、解释器模式

文章目录 1、解释器模式2、案例 1、解释器模式 计算一个表达式的值&#xff0c;比如12-34-7&#xff0c;单纯的定义方法或函数很难适配所有&#xff0c;因为数值和运算符可以有无数种组合。 //用于n个整数相加 public static int add(Integer ... arr) {int sum 0;for (Inte…

网络学习:BGP路径属性分类

目录 前言&#xff1a; 路径属性分类 公认必遵 公认任意 可选过渡 可选非过渡 前言&#xff1a; 在默认情况下&#xff0c;到达同一目的地&#xff0c;BGP只走单条路径&#xff0c;并不会在多条路径之间执行负载均衡。对于IGP路由协议&#xff0c;当有多条路径可以到达同…

腐烂的橘子 力扣bfs

BFS用来搜索最短路径的解法是比较合适的。 比如求最少步数的解&#xff0c;最少交换次数的解&#xff0c;最快走出迷宫等等&#xff0c;因为bfs搜索过程中遇到的第一个解一定是离最初位置最近的&#xff0c;所以遇到第一个解&#xff0c;一定就是最优解&#xff0c;此时搜索算…

表单修饰符和事件修饰符

表单修饰符和事件修饰符 表单修饰符 v-model.lazy v-model.lazy 失去焦点后再收集数据 <div id"app"><textarea name"" id"" cols"30" rows"10" v-model.lazy"a"></textarea>{{a}}<textar…

水果音乐编曲和制作软件 FL Studio 中文汉化破解版下载 FL Studio 中文设置教程

FL Studio 21 也就是 Image-Line 出品的一款功能强大的编曲软件&#xff0c;全名 Fruity Loops Studio 简称“FL Studio”。 FL Studio 21.2汉化破解版是功能强大的音乐制作解决方案&#xff0c;使用旨在为用户提供一个友好完整的音乐创建环境&#xff0c;让您能够轻松创建、管…

【ansible】ansible的介绍和安装

前言运维自动化 云计算核心职能 搭建平台架构 日常运营保障 性能效率优化 相关工具 代码管理&#xff08;SCM&#xff09;&#xff1a;GitHub、GitLab、BitBucket、SubVersion 构建工具&#xff1a;maven、Ant、Gradle 自动部署&#xff1a;Capistrano、CodeDeploy 持续…

JVM-5

1.选择垃圾收集器 如果你的堆大小不是很大&#xff08;比如 100MB &#xff09;&#xff0c;选择串行收集器一般是效率最高的。 参数&#xff1a; -XX:UseSerialGC 。如果你的应用运行在单核的机器上&#xff0c;或者你的虚拟机核数只有单核&#xff0c;选择串行收集器依然是合…

P6技巧:ORACLE Primavera P6 反馈项目Reflections的使用

前言 反馈是一个有趣的概念&#xff0c;就目前的了解而言&#xff0c;他是 Primavera P6 所独有的。 你可以将反馈视为项目的特殊假设副本。 然而&#xff0c;与直接拷贝副本不同的是&#xff0c;反馈保留了返回源项目的链接。 这意味着如果反馈发生更改&#xff0c;你可以将部…

Javascript 线性搜索算法

线性搜索被定义为一种顺序搜索算法&#xff0c;从一端开始&#xff0c;遍历列表中的每个元素&#xff0c;直到找到所需的元素&#xff0c;否则搜索将继续&#xff0c;直到数据集的末尾。 线性搜索算法 线性搜索算法如何工作&#xff1f; 在线性搜索算法中&#xff1a; …

C++语法、Linux命令查询网站

文章目录 1.cplusplus2.cppreference3.Linux命令查询网站 1.cplusplus 网址&#xff1a;https://legacy.cplusplus.com/ 2.cppreference 1.cppreference中文网站&#xff1a;https://zh.cppreference.com/w/首页 2.cppreference英文原站&#xff1a;https://en.cppreference…

openssl3.2 - note - Decoders and Encoders with OpenSSL

文章目录 openssl3.2 - note - Decoders and Encoders with OpenSSL概述笔记编码器/解码器的调用链OSSL_STORE 编码器/解码器的名称和属性OSSL_FUNC_decoder_freectx_fnOSSL_FUNC_encoder_encode_fn官方文档END openssl3.2 - note - Decoders and Encoders with OpenSSL 概述 …

【STM32学习】PWM学习,(二)驱动LED呼吸灯

上文学习了PWM的基本概述&#xff0c;和PWM的各种参数&#xff0c;本文 学习使用PWM信号去驱动LED实现呼吸灯的效果。 1、PWM驱动LED呼吸灯 1.1介绍 目标&#xff1a;单片机输出一个PWM信号&#xff0c;驱动LED呼吸亮灭。PWM占空比高&#xff0c;则LED更亮&#xff1b;PWM占空…

第12章 指针

以下内容是学习尚硅谷 12.1 指针基本介绍 1&#xff09;指针是C语言的精华&#xff0c;也是C语言的难点 2&#xff09;指针&#xff0c;也就是内存的地址&#xff1b;所谓指针变量&#xff0c;也就是保存了内存地址的变量。关于指针的基本使用&#xff0c;在讲变量的时候做了…

【SCI论文】“学术丑闻揭露:当AI写作遭遇学术审稿,ChatGPT意外成为论文共作者!“

在最近的学术圈中出现了一篇令人哭笑不得的论文。这篇文章标题为“The three-dimensional porous mesh structure of Cu-base…”发表在《Surfaces and Interfaces》杂志上&#xff0c;竟然包含了ChatGPT的提示语&#xff0c;暴露出了审稿过程中可能的疏忽。 文章讨论了铜基金…

【四 (5)数据可视化之 Pyecharts常用图表及代码实现 】

目录 文章导航一、介绍[✨ 特性]二、安装Pyecharts三、主题风格四、占比类图表1、饼图2、环形图3、玫瑰图4、玫瑰图-多图5、堆叠条形图6、百分比堆叠条形图 五、比较排序类1、条形图2、雷达图3、词云图4、漏斗图 六、趋势类图表1、折线图2、堆叠折线图3、面积图4、堆叠面积图 七…

Linux:kubernetes(k8s)有状态的服务部署(14)

之前我都是对无状态进行的一个操作&#xff0c;我们想扩容就扩容&#xff0c;想缩容就缩容&#xff0c;根本不用去考虑他的一个网络环境&#xff0c;本地储存环境啥的一个状态 当我们做有状态的服务的操作&#xff0c;肯定要申请一个持久化的一个空间&#xff0c;以及网络&…

tcp/ip协议2实现的插图,数据结构8 (30 - 32章)

(201) 201 三十0 中断优先级补充 (202) 202 三十1 TCP的用户需求 函tcp_usrreq一 (203) 203 三十2 TCP的用户需求 函tcp_usrreq二 (204) 204 三十3 TCP的用户需求 函tcp_usrreq三 (205) 205 三十4 TCP的用户需求 函tcp_usrreq四 (206) 206 三十5 TCP的用户需求 函tcp_usrreq五 …