Linux文件描述符剖析

文章目录

  • 文件描述符
  • 文件描述符分配规则
  • 重定向
  • 软硬链接
    • 软链接(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.mzph.cn/news/728162.shtml

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

相关文章

Java开发从入门到精通(一):Java的基础语法高阶

Java大数据开发和安全开发 &#xff08;一)Java的流程控制1.1 分支语句1.1.1 IF分支语句第一种IF语句第二种IF-ELSE语句第三种IF-ELSE IF-ELSE语句if语句使用的几个常见问题 1.1.2 switch分支语句switch分支的执行流程switch分支的导学案例:电子备忘录if、switch的比较&#xf…

从一个问题开始聊聊clickhouse的物化视图

【问题】 今天有A问我一个问题&#xff0c;我明明创建了一个物化视图&#xff0c;源表是有数据的&#xff0c;为什么查询物化视图就没有数据&#xff1f; 创建物化视图的SQL示意如下&#xff1a; CREATE MATERIALIZED VIEW schema1.test_mvon cluster clusterNameTO schema1…

【物联网应用案例】从0到N,智慧农业的数据价值

智慧农业全方位渗透到农业的每一个环节&#xff0c;云端解决方案更推动了研究人员、农艺师及农民间的密切协作&#xff0c;为研发企业提供了既经济又具扩展性的完美方案。 据IDC预计&#xff0c;到2036年&#xff0c;农场收集的数据量将增加800%以上&#xff0c;这凸显了农业数…

七.AV Foundation 视频播放 - 图片进度条

引言 播放器的功能功能已经十分完善了&#xff0c;接下来我们给它添加一些提升用户体验的功能。当前市面上的主流播放器几乎都有一个非常友善的功能&#xff0c;用户在退拽进度条的时候可以看见进度条所处进度的视频画面&#xff0c;这对于用户来说是一种直观而且便捷的体验。…

LeetCode刷题---二叉树展开为链表

官方题解&#xff1a;LeetCode官方题解 解题思想&#xff1a; 当根节点不为空时&#xff0c;从二叉树根节点开始遍历 判断当前节点是否有左节点&#xff0c;如果不存在左节点&#xff0c;则当前节点向右移一位 如果存在左节点&#xff0c;创建辅助节点指向左节点&#xff0c;判…

【Python】新手入门(9):数值和序列

&#x1f40d;【Python】新手入门&#xff08;9&#xff09;&#xff1a;数值和序列 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&am…

O2O:Offline Meta-Reinforcement Learning with Online Self-Supervision

ICML 2022 paper Introduction 元强化学习(Meta RL)结合O2O。元RL需要学习一个探索策略收集数据&#xff0c;同时还需学习一个策略快速适应新任务。由于策略是在固定的离线数据集上进行元训练的&#xff0c;因此在适应探索策略收集的数据时&#xff0c;它可能表现得不可预测&…

飞桨AI框架安装和使用示例

飞桨AI框架安装和使用示例 飞桨PaddlePaddle是非常流行的国产AI框架&#xff0c;让我们一起来动手实践吧&#xff01; 安装 飞桨安装参考页面&#xff1a;https://www.paddlepaddle.org.cn/install/quick?docurl/documentation/docs/zh/install/pip/linux-pip.html 在这个安…

垃圾分类网站|基于Springboot框架+java+MYSQL数据库的垃圾分类网站开发设计与实现(可运行源码+数据库+文档)

目录 1.摘 要 2.系统结构设计 3.系统顺序图设计 4.数据库设计 5.系统详细设计 用户前台功能模块 管理员功能模块 垃圾分类管理员功能模块 论文参考 文末获取源码 1.摘 要 本论文主要论述了如何使用JAVA语言开发一个垃圾分类网站 &#xff0c;本系统将严格按照软件开发…

「雷神加速器」pubg m登陆不上去、连接超时、无法进入游戏解决方法

Pubg Mobile(简称pubg m)作为人气吃鸡端游绝地求生PUBG的正版授权手游,完美保留了游戏中跳伞、跑毒、缩圈、捡装备的经典要素玩法,在手游玩家中有着极高的人气。近期,不少老玩家在登陆启动pubg m时出现登陆不上去、连接超时、无法进入游戏的情况,这里为大家整理汇总了几种常用解…

一款高输出电流 PWM 转换器

一、产品描述 TPS543x 是一款高输出电流 PWM 转换器&#xff0c;集成了低电阻、高侧 N 沟道 MOSFET。具有所列的特性的基板上还包括高性能电压误差放大器&#xff08;可在瞬态条件下提供高稳压精度&#xff09;、欠压锁定电路&#xff08;用于防止在输入电压达到 5.5V 前启动&…

ps aux | grep xxxx和ps ef | grep xxxx这两个命令有什么区别

命令实例 ps aux | grep nexus和ps ef | grep nexus ps aux | grep nexus 和 ps ef | grep nexus 这两个命令都用于在 Unix 或 Linux 系统中查找与 nexus 相关的进程&#xff0c;但它们在展示进程信息时有细微的区别。 ps aux | grep nexus: ps aux 是一种显示系统上所有运行进…

中间件 | Redis - [基本信息]

INDEX 1 常规用法2 QPS3 pipeline 1 常规用法 分布式锁 最常见用法&#xff0c;需要注意分布式锁的redis需要单点 分布式事务 分布式事务中&#xff0c;核心的技术难点其实是分布式事务这个事本身作为数据的持久化 2PC&#xff0c;比如 seata 的 AT 模式下&#xff0c;将 un…

HYBBS 表白墙网站PHP程序源码

安装教程 上传程序安装&#xff0c;然后设置账号密码&#xff0c;登陆后台切换模板手机PC都要换开启插件访问前台。 安装完成后如果不能正常访问就删除install安装文件夹 安装完成后右上角登录后点击头图进入后台 找到插件 安装表白墙配置插件 找到模板 将表白墙模板同时设…

Linux 开发工具 yum、git、gdb

目录 一、yum 1、软件包 2、rzsz 3、注意事项 4、查看软件包 5、安装软件 6、卸载软件 二、git操作 1、克隆三板斧 2、第一次使用会出现以下情况&#xff1a; 未配置用户名和邮箱&#xff1a; push后弹出提示 三、gdb使用 1、背景 2、使用方法 例一&#xff1a…

MyBatis的#{}和${}:安全与灵活并存的SQL之道

MyBatis的#{}和${}&#xff1a;安全与灵活并存的SQL之道 MyBatis是一款广泛使用的Java持久化框架&#xff0c;提供了强大的SQL映射和数据库操作功能。在编写MyBatis的SQL语句时&#xff0c;我们经常会遇到#{}和${}两种不同的占位符语法。本文将详细解析#{}和${}的区别以及它们在…

Day30-Linux基础阶段总复习

Day30-Linux基础阶段总复习 1. 运维人员的三个核心职责&#xff08;了解&#xff09;2. 企业网站和应用的可用性的衡量标准&#xff08;重点&#xff09;2.1 高并发企业业务写入流程图2.2 中小型企业案例 3. Linux系统诞生发展过程中的关键代表人物4. 企业场景如何针对不同的业…

详解动态规划(算法村第十九关青铜挑战)

不同路径 62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finis…

HubSpot出海CRM智能化营销,创造无限商机

随着企业的全球化发展&#xff0c;营销的挑战也在不断增加。如何有效地管理多样化的市场、提升客户互动和参与度&#xff0c;成为了全球企业必须面对的重要问题。在这一挑战背景下&#xff0c;HubSpot出海CRM的营销自动化功能成为了企业的强大利器&#xff0c;为实施全球化营销…

Java多线程——synchronized、volatile 保障可见性

目录 引出synchronized、volatile 保障可见性Redis冲冲冲——缓存三兄弟&#xff1a;缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Java多线程——synchronized、volatile 保障可见性 synchronized、volatile 保障可见性 原子性&#xff1a;在一次或者多次操作时…