Linux文件描述符剖析

news2025/1/11 8:49:42

文章目录

  • 文件描述符
  • 文件描述符分配规则
  • 重定向
  • 软硬链接
    • 软链接(Symbolic Link):
    • 硬链接(Hard Link):

文件描述符

文件描述符(File Descriptor)是一个非负整数,用于标识打开的文件、套接字或其他I/O资源。它在Unix和类Unix操作系统中是一个重要的概念,用于管理进程对文件和I/O资源的访问。

文件描述符是操作系统内核与用户进程之间通信的一种方式。当用户进程需要访问文件、网络套接字或其他I/O资源时,它通过系统调用(如openreadwriteclose等)向内核请求操作,内核会返回一个文件描述符作为对该资源的引用。进程使用文件描述符来执行读、写、关闭等操作。

每个Unix进程启动时都会自动打开三个标准文件描述符:

  • 0:标准输入(stdin),用于读取输入。
  • 1:标准输出(stdout),用于输出信息。
  • 2:标准错误(stderr),用于输出错误信息。

这些文件描述符在进程启动时就会被分配,它们通常被用来与终端进行交互,但也可以通过重定向来改变它们的行为。

在这里插入图片描述

在Unix和类Unix操作系统中,每个进程都有一个打开文件描述符的表,这个表是通过files_struct结构体来表示的。files_struct结构体中包含了指向打开文件的指针数组,每个元素指向一个打开的文件对象,这些文件对象包含了关于文件的元数据以及指向文件数据的指针等信息。

当进程打开一个文件时,操作系统会在内核中创建一个文件对象(通常是一个file结构体),用来描述该文件的状态和相关信息。然后,操作系统会将这个文件对象添加到进程的文件描述符表中,并将文件描述符返回给进程。这样,进程就可以通过文件描述符来访问相应的文件对象。

因此,文件描述符确实是进程与文件之间的关联,通过文件描述符,进程可以在文件描述符表中找到对应的文件对象,从而对文件进行读取、写入、关闭等操作。

需要注意的是,文件描述符是一个抽象的概念,它并不直接指向文件对象,而是作为索引或标识符,通过它来查找文件对象。在内核中,文件描述符通常被映射到文件对象的数据结构,以便操作系统能够识别和处理相应的文件请求。

文件描述符分配规则

文件描述符通常是从最小的可用非负整数开始分配的。在大多数系统上,前三个文件描述符(0、1、2)通常用于标准输入、标准输出和标准错误,因此新的文件描述符会从3开始分配。

当一个文件描述符被关闭时,操作系统会尽可能快地重新使用该文件描述符。这意味着如果一个文件描述符被关闭,然后另一个文件被打开,那么新的文件描述符很可能会是之前关闭的那个。

  1 #include <stdio.h>
  2 #include <unistd.h>
  3 #include <sys/types.h>
  4 #include <sys/stat.h>
  5 #include <fcntl.h>
  6 
  7 int main()
  8 {
  9   printf("%d\n", stdin->_fileno);
 10   printf("%d\n", stdout->_fileno);
 11   printf("%d\n", stderr->_fileno);
 12 
 13   close(0);                                                                                                                                                                             
 14   int fd = open("demo.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
 15   printf("%d\n", fd);
 16   return 0;
 17 }

在这里插入图片描述

总体而言,文件描述符的分配规则通常是简单而直接的,但在编写涉及大量文件处理的程序时,了解文件描述符的分配规则是非常重要的,可以帮助您更好地管理和利用文件描述符资源。

重定向

重定向是Unix和类Unix操作系统中一个重要的概念,它允许将一个命令的输入和输出从默认位置(通常是终端)改变为其他位置,比如文件或另一个进程。

在这里插入图片描述

重定向通过修改文件描述符的行为来实现。具体来说,可以使用以下基本重定向操作符:

  • <:用于将文件内容重定向到命令的标准输入(stdin)。
  • >:用于将命令的标准输出(stdout)重定向到文件中,如果文件不存在,则创建文件;如果文件已存在,则将文件内容截断为零。
  • >>:用于将命令的标准输出(stdout)追加到文件末尾,如果文件不存在,则创建文件。
  1 #include <stdio.h>
  2 #include <unistd.h>
  3 #include <sys/types.h>
  4 #include <sys/stat.h>
  5 #include <fcntl.h>
  6 
  7 int main()
  8 {
  9   printf("%d\n", stdin->_fileno);
 10   printf("%d\n", stdout->_fileno);
 11   printf("%d\n", stderr->_fileno);
 12 
 13   close(1);
 14   int fd = open("demo.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
 15   printf("%d\n", fd);                                                                                                                                                                   
 16   return 0;
 17 }

代码中,首先打印了标准输入、标准输出和标准错误的文件描述符0,1,2。然后关闭标准输出文件描述符1后继续的打开文件,这时候就将文件描述符1分配给新打开的文件,所以打印的文件描述符就没有打印到显示器上,而是打印进了文件demo.txt中。

在这里插入图片描述

在Linux系统中,可以使用dupdup2等系统调用来实现文件描述符重定向。这些系统调用允许将一个文件描述符复制到另一个文件描述符,并可以用于将标准输入、标准输出重定向到文件。

  • dup2(oldfd, newfd):将文件描述符oldfd复制到文件描述符newfd上,并关闭newfd之前打开的任何文件。
  • dup(oldfd):复制文件描述符oldfd,返回新的文件描述符。

软硬链接

真正找到磁盘上文件的并不是文件名,而是inode。 其实在linux中可以让多个文件名对应于同一个inode。软链接(Symbolic Link)和硬链接(Hard Link)就是Linux操作系统中用于创建文件链接的两种不同方式。

软链接(Symbolic Link):

  1. 定义: 软链接是一个特殊的文件,它包含了目标文件的路径信息。
  2. 特点:
    • 软链接文件有自己的inode和数据块,它们只是指向目标文件的路径,并不包含实际的数据。
    • 软链接文件的大小为目标文件名的长度加上额外的一些元数据。
    • 软链接可以跨越文件系统边界,可以链接到不同文件系统中的文件。
    • 如果源文件被删除或移动,软链接仍然存在,但它将指向一个无效的位置。
  3. 创建: 使用ln -s命令创建软链接,语法为:ln -s [target] [link_name]

硬链接(Hard Link):

  1. 定义: 硬链接是目标文件的另一个名称,它与原始文件共享相同的inode和数据块。
  2. 特点:
    • 硬链接文件和原始文件具有相同的inode号,因此它们共享相同的数据块。
    • 硬链接不能跨越文件系统边界,只能在同一个文件系统中创建。
    • 如果原始文件被删除,硬链接仍然存在,因为它们共享相同的inode,直到所有链接都被删除。
  3. 创建: 使用ln命令创建硬链接,语法为:ln [target] [link_name]

软链接和硬链接是文件系统中两种不同的链接方式,它们有一些重要的区别:

  1. 指向对象不同:

    • 软链接指向的是文件的路径,而不是文件本身。
    • 硬链接指向的是文件本身的inode,即文件的实际数据块和元数据。
  2. 跨文件系统边界:

    • 软链接可以跨越文件系统边界,即可以链接到不同文件系统中的文件。
    • 硬链接不能跨越文件系统边界,只能在同一个文件系统中创建。
  3. 目标文件删除或移动的影响:

    • 如果软链接指向的目标文件被删除或移动,软链接仍然存在,但是它会变成一个无效的链接。
    • 如果硬链接指向的目标文件被删除,硬链接仍然存在,直到所有指向该文件的硬链接都被删除,才会真正释放文件的数据块和inode。
  4. 文件类型:

    • 软链接是一个特殊类型的文件,它有自己的inode和数据块,但是不包含实际的文件内容。
    • 硬链接是文件本身的另一个名称,它与原始文件共享相同的inode和数据块。
  5. 文件大小:

    • 软链接文件的大小是目标文件路径的长度加上一些额外的元数据大小。
    • 硬链接文件和原始文件共享相同的数据块,因此它们的大小相同。

总的来说,软链接和硬链接各有其自身的特点和应用场景。软链接适用于需要跨越文件系统边界、需要指向目录、或者需要链接到不存在的文件的情况。硬链接适用于需要共享相同数据块的文件,且只能在同一个文件系统中使用。

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

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

相关文章

【电路笔记】-NPN晶体管

NPN晶体管 文章目录 NPN晶体管1、概述2、双极NPN晶体管配置3、NPN晶体管中的α和β关系4、示例5、共发射极配置1、概述 NPN 晶体管是三端三层器件,可用作放大器或电子开关。 在前面的文章中,我们看到标准双极晶体管或 BJT 有两种基本形式。 NPN(负-正-负)配置和PNP(正-负…

腾讯云服务器和阿里云服务器哪家更优惠?2024价格对比

2024年阿里云服务器和腾讯云服务器价格战已经打响&#xff0c;阿里云服务器优惠61元一年起&#xff0c;腾讯云服务器61元一年&#xff0c;2核2G3M、2核4G、4核8G、4核16G、8核16G、16核32G、16核64G等配置价格对比&#xff0c;阿腾云atengyun.com整理阿里云和腾讯云服务器详细配…

好物周刊#44:现代终端工具

https://github.com/cunyu1943 村雨遥的好物周刊&#xff0c;记录每周看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;每周五发布。 一、项目 1. Github-Hosts 通过修改 Hosts 解决国内 Github 经常抽风访问不到&#xff0c;每日更新。 2. 餐饮点餐商城 针对…

火柴排队(逆序对 + 离散化)

505. 火柴排队 原题链接 思路 如下是画图分析的一些过程 在这里贪心的思路是排序&#xff0c;然后两个数组都是从小到大那样对应的话最终的答案可达到最小 而我们只能交换相邻的火柴&#xff0c;故在这里先假设一个简化版本&#xff0c;即A有序&#xff0c;而只需要对B进行…

【学习笔记】数据结构与算法06 - 堆:上堆、下堆、Top-K问题以及代码实现

知识来源&#xff1a;https://www.hello-algo.com/chapter_heap/heap/#4 文章目录 2.5 堆2.5.1 堆&#xff08;优先队列2.5.1.1 堆的常用操作 2.5.2 堆的存储与表示2.5.2.1 访问堆顶元素2.5.2.2 入堆时间复杂度 2.5.2.3 堆顶元素出堆时间复杂度 2.5.3 堆的常见应用2.5.4 建堆问…

WEB自动化测试----------Webdriver API 的使用

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

PTA L2-015 互评成绩

学生互评作业的简单规则是这样定的&#xff1a;每个人的作业会被k个同学评审&#xff0c;得到k个成绩。系统需要去掉一个最高分和一个最低分&#xff0c;将剩下的分数取平均&#xff0c;就得到这个学生的最后成绩。本题就要求你编写这个互评系统的算分模块。 输入格式&#xf…

[项目设计] 从零实现的高并发内存池(五)

&#x1f308; 博客个人主页&#xff1a;Chris在Coding &#x1f3a5; 本文所属专栏&#xff1a;[高并发内存池] ❤️ 前置学习专栏&#xff1a;[Linux学习] ⏰ 我们仍在旅途 ​ 目录 8 使用定长内存池脱离new 9. 释放对象时不传大小 10.性能优化 10.1…

使用Kali搭建钓鱼网站教程

一、前言 使用kali工具一分钟制作出和目标网站一模一样的钓鱼网站。目标用户使用钓鱼网站登录自己的账号&#xff0c;账号密码将被自动劫持。 二、钓鱼网站的制作过程 1.在虚拟机VMvare中登录kali linux 2.准备一个目标网址 3.在kail中搜索使用工具 4.在弹出的选项中选择第一…

AttributeError: ‘ChatGLMTokenizer‘ object has no attribute ‘sp_tokenizer‘

目录 问题描述 在使用ChatGLMlora微调的时候&#xff0c;报错“AttributeError: ChatGLMTokenizer object has no attribute sp_tokenizer“ ​编辑问题解决&#xff1a; 问题描述 在使用ChatGLMlora微调的时候&#xff0c;报错“AttributeError: ChatGLMTokenizer object h…

面试题之——事务失效的八大情况

事务失效的八大情况 一、非public修饰的方法 Transactional注解只能在在public修饰的方法下使用。 /*** 私有方法上的注解&#xff0c;不生效&#xff08;因私有方法Spring扫描不到该方法&#xff0c;所以无法生成代理&#xff09;*/ Transactional private boolean test() …

Flink实时数仓之用户埋点系统(一)

需求分析及框架选型 需求分析数据采集用户行为采集业务数据采集 行为日志分析用户行为日志页面日志启动日志APP在线日志 业务数据分析用户Insert数据用户Update数据 技术选型Nginx配置Flume配置MaxWellHadoopFlink架构图 需求分析 数据采集 用户行为采集 行为数据&#xff1…

【软件测试】上岗第一天,组长就要我做自动化测试?我该咋办?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 如果你恰好刚刚进…

请说明Vue中的Error Boundaries

当我们开发基于Vue框架的应用时&#xff0c;我们经常会遇到各种错误处理的情况。Vue提供了一种非常强大且简单的方式来处理这些错误&#xff0c;那就是Error Boundaries&#xff08;错误边界&#xff09;。本文将从概念、用法和示例代码三个方面来详细介绍Vue中的Error Boundar…

数据结构—KMP 算法:

算法思想&#xff1a; KMP算法实现寻找主串中子串的位置时&#xff0c;主串指针地址不回退&#xff0c;在比对过程中串仅仅遍历一次&#xff0c;子串的回退可以是与当前主串可重新最多匹配的地址位置。 BF与KMP算法比对&#xff1a; KMP BF 主串不用回退 主串回退&#xf…

【npm】node包管理工具npm的介绍和基础使用

简言 npm 是 Node.js 的 包管理器&#xff08;Package Manager&#xff09;&#xff0c;它是专门用于管理 Node.js 项目中第三方库的工具。 本文介绍下npm和其使用方法。 npm介绍 npm 是世界上最大的软件注册中心。各大洲的开源开发者都使用 npm 共享和借用软件包&#xff…

【开源】SpringBoot框架开发陕西非物质文化遗产网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 设计目标2.2 研究内容2.3 研究方法与过程2.3.1 系统设计2.3.2 查阅文献2.3.3 网站分析2.3.4 网站设计2.3.5 网站实现2.3.6 系统测试与效果分析 三、系统展示四、核心代码4.1 查询民间文学4.2 查询传统音乐4.3 增改传统舞…

好书安利:《大模型应用开发极简入门:基于GPT-4和ChatGPT》这本书太好了!150页就能让你上手大模型应用开发

文章目录 前言一、ChatGPT 出现&#xff0c;一切都变得不一样了二、蛇尾书特色三、蛇尾书思维导图四、作译者简介五、业内专家书评总结 前言 ​如果问个问题&#xff1a;有哪些产品曾经创造了伟大的奇迹&#xff1f;ChatGPT 应该会当之无愧入选。仅仅发布 5 天&#xff0c;Chat…

服务器严重不够啊

必需采购服务器了&#xff0c;

JavaScript——流程控制(程序结构)

JavaScript——流程控制&#xff08;程序结构&#xff09; 流程控制就是来控制我们的代码按照什么结构顺序来执行。更倾向于一种思想结构。 流程控制分为三大结构&#xff1a;顺序结构、分支结构、循环结构 1、顺序结构 ​ 代码从上往下依次执行&#xff0c;从A到B执行&#x…