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这个系统调用!

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

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

相关文章

flask库

文章目录 flask库1. 基本使用2. 路由路径和路由参数3. 请求跳转和请求参数4. 模板渲染1. 模板变量2. 过滤器3. 测试器 5. 钩子函数与响应对象 flask库 flask是python编写的轻量级框架&#xff0c;提供Werkzeug&#xff08;WSGI工具集&#xff09;和jinjia2&#xff08;渲染模板…

【PyTorch】基础学习:在Pycharm等IDE中打印或查看Pytorch版本信息

【PyTorch】基础学习&#xff1a;在Pycharm等IDE中打印或查看Pytorch版本信息 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1…

机器硬件命令

一、查看机器核数 有以下几种方法 1、lscpu命令 lscpu命令可以显示关于CPU的信息&#xff0c;包括核数、线程数等。在终端中输入以下命令即可查看CPU核数&#xff1a;该命令会输出CPU每个物理插槽的核数。 lscpu | grep "Core(s) per socket" | awk {print $NF} …

C++中实现String类

String类实现 概述示例开发环境代码运行结果 注意 概述 本文主要记录自己实现一个String类中的部分功能。 示例 开发环境 Windows下Visual Studio 2019。 代码 MyString.h #pragma once #include <iostream>class MyString{ public:MyString();MyString(char *p);…

github登录时解决2FA问题

使用Edge浏览器下载插件 https://microsoftedge.microsoft.com/addons/detail/authenticator-2fa-client/ocglkepbibnalbgmbachknglpdipeoio 下载后弹框会显示是否添加&#xff0c;添加。如下&#xff1a; Chrome下 https://chrome.google.com/webstore/detail/authenticator…

景联文科技:提供通用多模态数据,助力AI多模态领域实现飞跃式发展

回顾2023年&#xff0c;以ChatGPT为代表的通用人工智能大模型在全球范围内掀起了新一轮人工智能产业发展浪潮&#xff0c;我国人工智能大模型市场呈现百“模”争鸣、日新月异的迅猛发展态势。 根据大模型之家、钛媒体数据&#xff0c;2023年中国大模型市场规模达到147亿人民币&…

Elasticsearch:从 Java High Level Rest Client 切换到新的 Java API Client

作者&#xff1a;David Pilato 我经常在讨论中看到与 Java API 客户端使用相关的问题。 为此&#xff0c;我在 2019 年启动了一个 GitHub 存储库&#xff0c;以提供一些实际有效的代码示例并回答社区提出的问题。 从那时起&#xff0c;高级 Rest 客户端 (High Level Rest Clie…

vizro,一个有趣的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个有趣的 Python 库 - vizro。 Github地址&#xff1a;https://github.com/mckinsey/vizro 在当今数据驱动的世界中&#xff0c;数据可视化扮演着至关重要的角色。它不仅可以…

西门子PLC常用底层逻辑块分享_电动蝶阀

文章目录 前言一、功能概述二、电动蝶阀程序编写1.创建自定义数据类型2.创建FB功能块“电动蝶阀”3.编写程序 前言 本文分享一个自己编写的电动蝶阀控制逻辑块。 一、功能概述 手动状态、自动状态、机旁状态、强制状态、检修状态自由切换&#xff1b;具有开阀超时、关阀超时报…

状态机高阶讲解-06

1069 00:45:36,160 --> 00:45:37,660 那下一个用途 1070 00:45:39,010 --> 00:45:43,830 就是为分割系统提供一些参考的证据了 1071 00:45:47,230 --> 00:45:49,470 现在很多那个 1072 00:45:49,880 --> 00:45:51,770 流行有微服务架构 1073 00:45:51,770 --&g…

MATLAB/SIMULINK流水账

01.模块大小的一致性 当模型建完以后&#xff0c;模型大小比较散乱&#xff0c;可以利用该功能快速整理模块的大小 例如&#xff1a;如下5个constant模块&#xff0c;大小不一 若想把所有的模块都调整至跟第3个模块一样的大小 需要先把5个模块全部选取起来&#xff0c;另外再…

数字多空策略(实盘+回测+数据)

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学&#xff0c;点击下方链接报名&#xff1a; 量化投资速成营&#xff08;入门课程&#xff09; Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…

3.15号arm

汇编语言 1. 汇编语言的组成 汇编文件中由伪操作、伪指令、汇编指令以及代码注释这几部分组成 伪操作&#xff1a; ARM的汇编中伪操作以.为前缀&#xff0c;所有的伪操作不占用内存空间&#xff0c;编译汇编时告诉编译器怎么编译当前文件&#xff0c;主要用来修改汇编内…

QT下跨平台库实现及移植经验分享

最近在移植公司一个QT桌面软件到android上&#xff0c;有一些公司自定义的库&#xff0c;用了很多windows的api&#xff0c;移植过程很是曲折&#xff0c;在此有一些感悟分享一下~ 一.自编写跨平台库 1.有时候为了程序给第三方用需要编译一些qt封装库&#xff0c;并可能跨平台…

【SQL Server】实验四 数据更新

1 实验目的 掌握SQL数据更新语句的基本使用方法&#xff0c;如UPDATE、DELETE、INSERT。掌握更新语句条件中的嵌套查询使用方法。 2 实验内容 2.1 掌握SQL更新语句的基本使用方法 INSERT基本语句。UPDATE基本语句。DELETE基本语句。 2.2 掌握SQL更新语句的高级使用方法 …

Soft Robotics 变结构手掌和变刚度手指的仿人软体手的人机交互操作-武科大ESIR课题组师兄成果

一、引言 在当今的机器人技术领域&#xff0c;人类对机器人的需求日益增长&#xff0c;涉及到工业生产、医疗护理、服务业等各个领域。然而&#xff0c;由于任务的多样性和复杂性&#xff0c;单独依靠自主机器人操作往往难以满足实际需求。为了解决这一问题&#xff0c;人机协作…

社交革命的引领者:探索Facebook如何改变我们的生活方式

1.数字社交的兴起 随着互联网的普及&#xff0c;社交媒体成为我们日常生活的重要组成部分。Facebook作为其中的先驱&#xff0c;从最初的社交网络演变成了一个拥有数十亿用户的全球化平台。它不仅改变了我们与世界互动的方式&#xff0c;还深刻影响了我们的社交习惯、人际关系以…

从 VNCTF2024 的一道题学习QEMU Escape

说在前面 本文的草稿是边打边学边写出来的&#xff0c;文章思路会与一个“刚打完用户态 pwn 题就去打 QEMU Escape ”的人的思路相似&#xff0c;在分析结束以后我又在部分比较模糊的地方加入了一些补充&#xff0c;因此阅读起来可能会相对轻松。&#xff08;当然也不排除这是…

Python面试笔记

Python面试笔记 PythonQ. Python中可变数据类型与不可变数据类型&#xff0c;浅拷贝与深拷贝详解Q. 解释什么是lambda函数&#xff1f;它有什么好处&#xff1f;Q. 什么是装饰器&#xff1f;Q. 什么是Python的垃圾回收机制&#xff1f;Q. Python内置函数dir的用法&#xff1f;Q…

论文阅读——VSA

VSA: Learning Varied-Size Window Attention in Vision Transformers 方法&#xff1a; 给定输入特征X&#xff0c;VSA首先按照基线方法的例程&#xff0c;将这些标记划分为几个窗口Xw&#xff0c;窗口大小为预定义的w。我们将这些窗口称为默认窗口&#xff0c;并从默认窗口中…