UNIX环境高级编程_文件IO_文件描述符

news2024/9/21 21:17:54

这篇文章记录文件描述符,下一篇文章记录文件描述表。

1 文件描述符

先说说什么是文件IO。文件的IO就是文件的输入输出,也就是文件的读写。读和写是以CPU为参考的,从CPU向文件中写入数据,就是写操作;从文件中读取数据就是文件的读操作。
在这里插入图片描述

1.1 什么是文件描述符?

当我们用open函数打开一个文件,打开成功返回一个非负整数(0,1,2…1023),这个非负整数指向了打开的文件,这就是文件描述符。比如,用open打开一个文件,打印出文件描述符,如下图所示。
在这里插入图片描述

1.2 文件描述符池

系统给每个进程分配0~ 1023的文件描述符范围,也就是说每个进程打开文件时,open所返回的文件描述符是0~ 1023范围中的某个数字。文件描述符0~1023这个范围,其实就是文件描述符池。

1.3 在程序中第一个打开的文件,为什么返回的是3?

open返回文件描述符是有规则的:open返回文件描述符池中,当前最小没用的一个。程序运行后,0/1/2默认就被使用了,文件描述符0与进程的标准输入关联,文件描述符1与标准输出关联,文件描述符2与标准错误关联。所以,打开一个文件描述符池中最小没被用的是3。如果又打开一个文件,最小没被用的就应该是4,所以open返回的应该是4。

1.4 文件关闭后,被占用的描述符怎么办

当文件关闭后,当前文件的描述符会被释放,等着下一次open时,被重复利用。当文件被关闭后,文件描述符被收回到文件描述池中,

1.5 open的文件描述符 与 fopen的文件指针

1.5.1 open:Linux 的系统函数(man 2 系统函数)

open成功后,返回的文件描述符,指向了打开的文件。

1.5.2 fopen:C库的标准io函数(man 3 库函数)

#include <stdio.h>				
FILE *fopen(const char *path, const char *mode);

fopen成功后,返回的是FILE *的文件指针,指向了打开的文件。

1.5.3 fopen和open关系

fopen只是对open这个函数做了二次封装。fopen的文件指针,最终还是会被换成open的文件描述符,然后用于去操作打开的文件。
在这里插入图片描述

1.6 errno和错误号

如果open失败了,只是笼统的打印出“打开文件失败了”,但是并没有提示具体出错的原因,没有详细的出错原因提示。如何具体打印出详细的出错信息呢?这就是errno的作用了。

1.6.1 什么是ernno

errno是Linux中的一个全局变量。函数调用出错时,Linux系统使用错误编号(整形数)来标记具体出错的原因,每个函数有很多错误号,每个错误号代表了一种错误,产生这个错误时,会自动的将错误号赋值给errno这个全局变量。
如何知道某一个错误号对应的是什么错误呢?比如,下图中错误号等于2,表示什么错误呢?就要用到下面的perror库函数了。
在这里插入图片描述

1.6.2 perror函数自动将“错误号”换成对应的文字信息,并打印出来

man 3 perror,perror是一个C库函数,不是一个系统函数。
在这里插入图片描述
在这里插入图片描述
上面输入一个错误路径,用perror打印对应的错误信息。

1.6.3 perror工作原理

perror的工作原理: 调用perror函数时,它会自动去找到一张对照表,将errno中保存的错误号,换成具体的文字信息并打印出来,我们就能知道函数的具体错误原因了。
在这里插入图片描述

1.6.4 如何查看错误号

每个错误号代表了一种函数可能的出错情况,通过man perror 这个函数,就可以查看错误号了。
在这里插入图片描述

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

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

相关文章

Aviation turbofan starting model

Aviation turbofan starting model 涡扇发动机(Turbofan)即涡轮风扇发动机,来源于涡轮喷气发动机,主要是为了解决涡轮喷气发动机耗油率过高的问题。其结构特点是流过风扇的空气一部分进入压气机(内涵道),一部分进入由压气机外部通道(外涵道)流过,这部分气流不经过燃烧…

01 - Linux系统概要(再论计算机系统)

---- 整理自狄泰软件唐佐林老师课程 1. 再论计算机系统 计算机系统由躯体和灵魂两部分组成 – 躯体&#xff1a;构成计算机系统的电子设备&#xff08;硬件&#xff09; – 灵魂&#xff1a;指挥躯体完成动作的指令序列&#xff08;软件&#xff09; 躯体核心&#xff1a;中央…

2022-12-05 优化el-tree懒加载选人树

今后就都拼抵抗力了嗷 需求描述 此处有一棵懒加载树&#xff08;可选人&#xff09;&#xff0c;右侧展示已选中的人。且父子关联&#xff0c;可以通过选中一个部门勾选所有子节点。问题是&#xff0c;选中父节点&#xff0c;当子节点未加载时&#xff0c;是获取不到勾选的子…

Redis配置、持久化以及相命令

Redis 什么是Redis Redis&#xff08;远程字典服务器&#xff09;是一个开源的、使用C语言编写的NoSQL数据库 Redis 基于内存运行并支持持久化&#xff0c;采用key-value&#xff08;键值对&#xff09;的存储形式&#xff0c;是目前分布式架构中不可或缺的一环。 Redis服务…

新来的性能测试工程师工资25K,看了他做的性能测试,那才真叫牛

一直深耕于互联网行业的测试工作&#xff0c;前期测试主要以项目为主&#xff0c;也就是 一个人负责2-3个项目 的测试工作&#xff0c;当然包括项目上功能、自动化和性能等一切测试工作。 我有几个朋友也在互联网大厂工作&#xff0c;从他们当中了解到其实真正的互联网大厂&…

【前端CSS】网站都变成灰色了,它是怎么实现的?(含源代码解析)

目录&#xff1a;网站都变成灰色了&#xff0c;它是怎么实现的&#xff1f;一、前言二、如何实现的三、代码的理解3.1 CSS3 filter(滤镜) 属性3.2 定义和使用3.2.1 CSS动画演示3.2.2 JS语法演示3.3 浏览器支持3.4 CSS 语法3.5 Filter 函数四、实例展示4.1 模糊实例4.2 Brightne…

3、JSP——Servlet、IDEA创建Web项目、IDEA创建JSP页面

目录 一、Servlet的概念 二、Servlet的作用 三、IDEA中创建Web项目 四、手动部署 五、自动部署 1、IDEA部署Tomcat服务器 2、IDEA部署JavaWeb项目 3、JSP页面 一、Servlet的概念 &#xff08;1&#xff09;Servlet&#xff1a;Server Applet的简称&#xff0c;是运…

云服务器配置Code-Server环境并运行Python和C++

目录1、前言2、部署流程2.1 前置准备2.2 运行docker安装Code-Server3、运行Code-Server3.1 配置运行环境3.2 运行Python3.3 运行C1、前言 云服务器需要配置C开发环境&#xff0c;了解到有code-server这个VsCode提供的云端服务&#xff0c;因此选择在云服务器上部署。 2、部署流…

D3--FPGA IIC接口通信2022-12-05

1.IIC简介 1.1 IIC概述 IIC即 Inter-Integrated Circuit(集成电路总线&#xff09;&#xff0c;是由 Philips 半导体公司在八十年代初设计出来的一种简单、双向、二线制总线标准。多用于主机和从机在数据量不大且传输距离短的场合下的主从通信。主机启动总线&#xff0c;并产…

[附源码]计算机毕业设计少儿节目智能推荐系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Android 基础知识4-2.2常用控件提示(Toast)

效果图&#xff1a; 介绍&#xff1a; Toast是Android提供的“快显讯息”类&#xff0c;Toast类的使用非常简单&#xff0c;而且用途很多。比如&#xff0c;当退出应用程序时&#xff0c;可以用它来提示用户“需要更新”&#xff0c;或者当在输入框中输入文本时&#xff0c;可以…

含有双硫键的交联剂NHS-PEG1-SS-PEG1-NHS,NHS-SS-NHS,活性酯-双硫键-活性酯

基础产品数据&#xff08;Basic Product Data&#xff09;&#xff1a; 中文名&#xff1a;活性酯-双硫键-活性酯 英文名&#xff1a;NHS-SS-NHS&#xff0c;NHS-PEG1-SS-PEG1-NHS 结构式&#xff08;Structural&#xff09;&#xff1a; 详细产品数据&#xff08;Detailed Pro…

批量查询谷歌PR权重的方法有哪些?是什么影响着谷歌PR值?

批量查询谷歌PR权重的方法有哪些&#xff1f; 查询谷歌PR权重最简单最最直接的方法就是使用站长工具查询&#xff0c;具体操作如下&#xff1a; 首先打开站长工具&#xff0c;在域名输入框输入网站的域名&#xff08;一行一个&#xff09;&#xff1b; 然后勾选需要查询的功能&…

NumPy模块使用介绍

NumPy使用介绍1.NumPy科学计算库介绍和环境准备 ​ NumPy&#xff08;Numerical Python&#xff09;是Python的⼀种开源的数值计算扩展。提供多维数组对象&#xff0c;各种派⽣对象&#xff08;如掩码数组和矩阵&#xff09;&#xff0c;这种⼯具可⽤来存储和处理⼤型矩阵&…

Qt下多线程的四种使用方法总结及代码示例

文章目录前言一、继承QThread&#xff0c;重写run()函数二、继承QObject&#xff0c;使用moveToThread()函数三、继承QRunnable&#xff0c;重写run()函数&#xff0c;使用QThreadPool线程池四、使用QtConcurrent的run()函数五、示例代码六、下载链接总结前言 在之前的Qt开发工…

时间序列分析的基本流程(R语言版——实验篇)

数据处理 1.导入数据&#xff08;.csv&#xff09; 能导入绝大所数形式的格式文件 ex52<-read.table("C:\\Users\\33035\\Desktop\\习题5.2数据.txt",headerT,fileEncoding GBK) #header &#xff1a;T:表示留第一行 #fileEncoding:有中文时最好改为GBK 2.对数…

MySQL---DDL

MySQL简介DDL操作 文章目录MySQL简介DDL操作数据库分类关系型数据库&#xff08;SQL&#xff09;非关系型数据库&#xff08;NOSQL&#xff09;区别DBMSMySQL简介概念特点MySQL运行机制SQL通用语法结构化查询语言分类DDL操作数据库操作表查询创建数据类型数值类型字符串类型日期…

入行测试已经4年了 ,进阿里后迷茫了3个月,做完这个项目我决定离职....

转行测试 我是大专非计科&#xff0c;我转行之前从事的工作是商场管理&#xff0c;努力了4年左右的时间才做到楼层经理&#xff0c;但是工资太低并且事情太多&#xff0c;薪资才6K。 更多的是坚定了自己的想法&#xff0c;我要改变自己 恰好有几个大学同学在互联网公司工作&a…

微电网重构|基于群稀疏性的机会约束微电网重构(Matlab代码和Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

python算法对音频信号处理Sonification :Gauss-Seidel迭代算法

可以将44.1kHz单通道.wav文件中的一秒读取到长度为44100的数组&#xff08;称为b&#xff09;中。给定矩阵A&#xff0c;我们寻求系统Ax b的解。通过Gauss-Seidel的迭代&#xff0c;向量如果我们将b记录的录音&#xff0c;则将一些白噪声作为我们的初始猜测&#xff0c;并在每…