当前位置: 首页 > news >正文

LINUX文件fd(file descriptor)文件描述符

目录

1.文件接口

1.1open

1.2C语言为什么要对open进行封装

2.fd

demo代码

第一个问题

第二个问题

打开文件流程

引言:在学习C语言的时候,我们见过很多的文件的接口,例如fopen,fwrite,fclose等等,但是仅仅凭借C语言的知识,我们并没有办法完全理解,只是知道怎么去用,希望看完这篇文章能加深你对文件的理解。

1.文件接口

C语言的各种的文件接口,必然是对系统调用的封装,打开一个文件必须,先将其加载到内存,这只有操作系统才能做到。

1.1open

返回值:打开或者创建新文件的fd(file descriptor)文件描述符,为什么是int,后面会讲。

pathname:打开或者创建文件的名字。

flag:打开方式(利用位图传参

        O_RDONLY以只读的方式打开

        O_WRONLY以只写的方式打开

        O_RDWR以读写的方式打开

        O_APPEND以追加的方式打开

        O_CREAT如果文件不存在,就创建个新文件

        O_TRUNC打开时将文件清空

mode:新创建文件的权限,受权限掩码影响。

其实这里已经很明显了,fopen("xxx","w")就是open("xxx",O_WRONLY | O_CREAT | O_TRUNC)

1.2C语言为什么要对open进行封装

因为不同平台的open接口是不同的,将open封装,保证了C语言的跨平台性,fopen调用不同平台的open接口

2.fd

demo代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main()
{umask(0);//权限掩码设置为0int fd1 = open("log1.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666);int fd2 = open("log2.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666);int fd3 = open("log3.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666);int fd4 = open("log4.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666);if(fd == -1){perror("open");return 1;}printf("fd: %d\n", fd1);printf("fd: %d\n", fd2);printf("fd: %d\n", fd3);printf("fd: %d\n", fd4);}

创建了文件,并且把他们fd全部打印出来。

执行结果

 看到这个执行结果有2个问题

1.0 1 2去哪里了

2.fd有些像数组下标

第一个问题

0 1 2是程序默认打开的三个文件流

stdin: 0 标准输入  键盘设备

stdout:1 标准输出 显示器设备

stderr:2 标准错误 显示器设备

printf("%d\n", stdin->_fileno);
printf("%d\n", stdout->_fileno);
printf("%d\n", stderr->_fileno);

第二个问题

stdin的类型是FILE * ,很明显stdin是一个结构体指针,说明LINUX系统内核中存在一种结构体,来描述文件。

struct file 就是对文件的描述,每个struct file都会存在一个struct file*next 指向下个struct file,操作系统就把对文件的管理,转化为对这个链表的管理。

打开文件的本质就是,程序执行open系统调用将文件打开,进程为了知道自己打开了哪些文件,在task_struct中会有一个struct file_struct *file的指针指向,一个struct file_struct的结构体,这个结构体中存在一个 struct file*的数组,fd就是这个数组的下标,我们通过fd就能找到对应的         struct file。

打开文件流程

首先就要为文件创建一个struct file ,将创建好的struct file链入链表中,然后放到struct file *fd array[],返回文件在数组中的下标。

fd的本质就是数组下标

        

相关文章:

LINUX文件fd(file descriptor)文件描述符

目录 1.文件接口 1.1open 1.2C语言为什么要对open进行封装 2.fd demo代码 第一个问题 第二个问题 打开文件流程 引言&#xff1a;在学习C语言的时候&#xff0c;我们见过很多的文件的接口&#xff0c;例如fopen&#xff0c;fwrite&#xff0c;fclose等等&#xff0c;但…...

SpringMVC 的理解

MVC MVC&#xff08;Model-View-Controller&#xff09;是一种软件设计模式&#xff0c;用于实现用户界面。它将应用程序划分为三个互相交互的部分&#xff0c;以分离内部逻辑表示和表现层。这种分离有助于管理复杂的应用程序&#xff0c;因为它允许开发者单独修改模型、视图或…...

SpringBoot 3.1.7 集成Sentinel

一、背景 我的项目需要引入限流&#xff0c;降级&#xff0c;熔断框架&#xff0c;由于 Spring Cloud 2022.0.4 已经不再支持 Hystrix&#xff0c;Spring Cloud 提供了替代方案&#xff0c;如 Resilience4j&#xff0c;可以使用它来替换 Hystrix。但是网上搜了一下国内Resilie…...

Elastic Stack 8.12:通过对 ES|QL 等的改进增强了向量搜索

作者&#xff1a;来自 Elastic Tyler Perkins, Shani Sagiv, Gilad Gal, Ninoslav Miskovic Elastic Stack 8.12 构建于 Apache Lucene 9.9&#xff08;有史以来最快的 Lucene 版本&#xff09;之上&#xff0c;基于我们对标量量化和搜索并发性的贡献&#xff0c;为文本、向量和…...

结构体的内存对齐(计算题常考点)

许久不见我考完试回来啦&#xff0c;让我们接着将结构体进行到底&#xff01; 目录 结构体对齐的意义&#xff1a; 结构体对齐的实现&#xff1a; 对齐规则&#xff1a; 训练&#xff1a; 好到这里误区来了&#xff1a; 总结&#xff1a; 往期回顾&#xff1a; 下期预告&…...

设置Json对象输出字段顺序

场景 通过情况下对前端输出json格式不需要关注字段顺序&#xff0c;但某些特殊场景需要设置字段输出顺序(例nginx需要对特殊字段顺序进行加密处理)&#xff1b;框架有默认的顺序&#xff0c;如 jackson 默认使用字段声明的顺序&#xff0c; fastjson 默认是使用字典序。 jackso…...

当 OpenTelemetry 遇上阿里云 Prometheus

作者&#xff1a;逸陵 背景 在云原生可观测蓬勃发展的当下&#xff0c;想必大家对 OpenTelemetry & Prometheus 并不是太陌生。OpenTelemetry 是 CNCF&#xff08;Cloud Native Computing Foundation&#xff09;旗下的开源项目&#xff0c;它的目标是在云原生时代成为应…...

【Flink-1.17-教程】-【四】Flink DataStream API(1)源算子(Source)

【Flink-1.17-教程】-【四】Flink DataStream API&#xff08;1&#xff09;源算子&#xff08;Source&#xff09; 1&#xff09;执行环境&#xff08;Execution Environment&#xff09;1.1.创建执行环境1.2.执行模式&#xff08;Execution Mode&#xff09;1.3.触发程序执行…...

【蓝桥杯EDA设计与开发】资料汇总以及立创EDA及PCB相关技术资料汇总(持续更新)

[18/01/2024]&#xff1a;目前为了准备蓝桥杯做一些资料贴&#xff0c;于是写下这一篇博客。 各种资料均来源于网络以及部分书籍、手册等文档&#xff0c;参考不保证其准确性。 如果在准备蓝桥杯&#xff0c;可与我私信共同学习&#xff01;&#xff01;&#xff01;&#xf…...

JavaEE学习笔记 2024-1-18 --模块化Controller层、AJAX与JSON

上一篇 个人整理非商业用途&#xff0c;欢迎探讨与指正&#xff01;&#xff01; 文章目录 11.模块化Controller层12.AJAX12.1使用场景 13.JSON13.1如何使用后端发送JSON数据 11.模块化Controller层 将对应模块的Servlet写入到一个指定的模块中,模块化编程 使用switch方式 p…...

rpc跨平台通信的简单案例,java和go

当我们使用Go和Java进行RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;跨平台通信时&#xff0c;你可以使用gRPC作为通信框架。gRPC是一个高性能、开源的RPC框架&#xff0c;它支持多种编程语言&#xff0c;包括Go和Java。下面我将为你提供一个简单…...

Java设计模式之观察者模式详解

Java设计模式之观察者模式详解 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我们将一同深入探讨Java设计模式之观察者模式&#xff0c;这是一种代…...

分布式锁实现(mysql,以及redis)以及分布式的概念

道生一&#xff0c;一生二&#xff0c;二生三&#xff0c;三生万物 我旁边的一位老哥跟我说&#xff0c;你知道分布式是是用来干什么的嘛&#xff1f;一句话给我干懵了&#xff0c;我能隐含知道&#xff0c;大概是用来做分压处理的&#xff0c;并增加系统稳定性的。但是具体如…...

实现分布式锁:Zookeeper vs Redis

目录 引言 1. Zookeeper分布式锁 1.1特点和优势&#xff1a; 强一致性 顺序节点 Watch机制 1.2 Zookeeper分布式锁代码示例 2. Redis分布式锁 2.1特点和优势&#xff1a; 简单高效 可续租性 灵活性 2.2Redis分布式锁代码示例 3.对比和选择 3.1 一致性要求 3.2…...

电脑录屏必备技能,让分享变得更加简单!

随着网络技术的飞速发展&#xff0c;电脑录屏已经成为日常工作和学习中不可或缺的一部分。无论是录制在线课程、游戏解说、软件教程&#xff0c;还是远程会议、演示文稿等&#xff0c;电脑录屏都有着广泛的应用。接下来&#xff0c;本文将介绍三种常见的电脑录屏方法&#xff0…...

重构改善既有代码的设计-学习(一):封装

1、封装记录&#xff08;Encapsulate Record&#xff09; 一些记录性结构&#xff08;例如hash、map、hashmap、dictionary等&#xff09;&#xff0c;一条记录上持有什么字段往往不够直观。如果其使用范围比较宽&#xff0c;这个问题往往会造成许多困扰。所以&#xff0c;记录…...

Python图像处理【19】基于霍夫变换的目标检测

基于霍夫变换的目标检测 0. 前言1. 使用圆形霍夫变换统计图像中圆形对象2. 使用渐进概率霍夫变换检测直线2.1 渐进霍夫变换原理2.2 直线检测 3. 使用广义霍夫变换检测任意形状的对象3.1 广义霍夫变换原理3.2 检测自定义形状 小结系列链接 0. 前言 霍夫变换 (Hough Transform,…...

Spring+SprinMVC+MyBatis注解方式简易模板

SpringSprinMVCMyBatis注解方式简易模板代码Demo GitHub访问 ssm-tpl-anno 一、数据准备 创建数据库test&#xff0c;执行下方SQL创建表ssm-tpl-cfg /*Navicat Premium Data TransferSource Server : 127.0.0.1Source Server Type : MySQLSource Server Version :…...

Python基础第五篇(Python数据容器)

文章目录 一、数据容器入门二、数据容器 list 列表(1),list 列表定义(2),list列表的索引(3),list列表的常见操作(4),list列表的遍历 三、数据容器&#xff1a;tuple&#xff08;元组&#xff09;(1),tuple元组定义(2),tuple元组的索引(3),tuple元组的常见操作(4),tuple元组的遍…...

【H3C】配置AAA认证和Telnet远程登陆,S5130 Series交换机

AAA配置步骤为&#xff1a; 1.开启telent远程登陆服务 2.创建用户&#xff0c;设置用户名、密码、用户的服务类型 3.配置终端登录的数量 4.配置vlan-if的ip地址&#xff0c;用来远程登陆 5.允许对应的vlan通过 1.开启telent远程登陆服务 sys …...

Windows 11下xray安装全流程:从下载到配置证书的保姆级教程

Windows 11安全工具配置全指南&#xff1a;从零开始搭建本地测试环境 在数字化生活日益普及的今天&#xff0c;个人电脑安全越来越受到重视。对于技术爱好者而言&#xff0c;了解和使用专业安全工具不仅能提升自身防护能力&#xff0c;也是学习网络安全知识的重要途径。本文将详…...

3个步骤解决老旧系统Python支持难题:Windows 7及以上系统兼容性解决方案

3个步骤解决老旧系统Python支持难题&#xff1a;Windows 7及以上系统兼容性解决方案 【免费下载链接】PythonVista Python 3.9 installers that support Windows 7 SP1 and Windows Server 2008 R2 项目地址: https://gitcode.com/gh_mirrors/py/PythonVista 在企业办公…...

提升数据抓取效率:用快马AI生成openclaw命令自动化脚本模板

最近在做一个数据抓取项目时&#xff0c;发现手动写openclaw命令实在太费时间了。每次都要重复写类似的fetch和parse命令&#xff0c;还要处理各种异常情况。后来发现用InsCode(快马)平台可以快速生成自动化脚本模板&#xff0c;效率提升了好几倍。今天就把这个经验分享给大家。…...

YOLOv11实战:打造交互式多源目标检测工具 | 从摄像头到批量图片一键处理

1. YOLOv11多源目标检测工具设计思路 去年我在做一个智能安防项目时&#xff0c;客户要求能同时处理监控摄像头、历史视频和图片证据&#xff0c;还要操作简单到保安大叔都能用。当时用YOLOv11折腾出的这套方案&#xff0c;现在分享给大家。这个工具的核心设计理念就三点&#…...

Web 开发者零 AI 基础入门:Skill 开发实战全攻略

引言&#xff1a;提示词是即兴发挥&#xff0c;Skill 是专业标准前言&#xff1a;作为 Web 开发者&#xff0c;我们早已习惯「组件化开发、接口化调用、工程化部署」的工作流。面对 AI 应用落地&#xff0c;很多人误以为必须精通大模型、机器学习才能参与开发。事实上&#xff…...

C++程序员逆袭之路:手把手教你转行大模型算法岗!

作为一名C程序员&#xff0c;你拥有强大的编程能力和对底层系统深入理解的优势。然而&#xff0c;如果你对大数据、深度学习和算法设计充满热情&#xff0c;转行到大模型算法岗位可能是一个充满挑战和机遇的职业转变。本文将为你提供一份详细的转行指南&#xff0c;帮助你从C开…...

LangFlow实战案例:如何用拖拽方式搭建智能写作助手

LangFlow实战案例&#xff1a;如何用拖拽方式搭建智能写作助手 1. 引言&#xff1a;为什么选择LangFlow 在AI技术快速发展的今天&#xff0c;大语言模型已经展现出强大的文本生成能力。然而&#xff0c;对于大多数非技术背景的内容创作者来说&#xff0c;直接调用API或编写复…...

LM358运放实战:手把手教你搭建电容传感器测量电路(附常见问题排查)

LM358运放实战&#xff1a;手把手教你搭建电容传感器测量电路&#xff08;附常见问题排查&#xff09; 在电子设计领域&#xff0c;电容式传感器因其非接触式测量、结构简单和成本低廉等优势&#xff0c;被广泛应用于液位检测、接近开关和湿度测量等场景。而要将微弱的电容变化…...

OpenClaw压力测试:QwQ-32B持续任务负载表现

OpenClaw压力测试&#xff1a;QwQ-32B持续任务负载表现 1. 测试背景与目标 最近我在本地部署了OpenClaw框架&#xff0c;并接入了一台搭载QwQ-32B模型的服务器。作为一个追求稳定性的技术爱好者&#xff0c;我特别想知道这个组合在长时间运行时的表现如何。于是&#xff0c;我…...

电子工程师职业发展路径与技术能力提升指南

电子工程师职业发展全景指南1. 职业发展路径解析1.1 新手工程师常见困境与突破电子行业新入行者普遍面临"三无"困境&#xff1a;无事可做、无人指导、工作缺乏技术含量。这种矛盾心态源于三个关键因素&#xff1a;行业认知不足&#xff1a;缺乏对电子产业链的全局认识…...