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. 文件大小:

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OJ习题之——圆括号编码

圆括号编码 1.题目描述2.完整代码3.图例演示 1.题目描述 题目描述 令Ss1 s2 …sn是一个规则的圆括号字符串。S以2种不同形式编码&#xff1a; &#xff08;1&#xff09;用一个整数序列Pp1 p2 … pn编码&#xff0c;pi代表在S中第i个右圆括号的左圆括号数量。&#xff08;记为…

C++——string(2)

5. string类非成员函数 上面的几个接口大家了解一下&#xff0c;下面的OJ题目中会有一些体现他们的使用。string类中还有一些其他的 操作&#xff0c;这里不一一列举&#xff0c;大家在需要用到时不明白了查文档即可。 试用rfind、substr、find、find_first_(not)_of void te…

WordPress供求插件API文档:用户登录

该文档为WordPress供求插件文档&#xff0c;详情请查看 WordPress供求插件&#xff1a;一款专注于同城生活信息发布的插件-CSDN博客文章浏览阅读67次。WordPress供求插件&#xff1a;sliver-urban-life 是一款专注于提供同城生活信息发布与查看的插件&#xff0c;该插件可以实…

Java中super关键字作用及解析

在 Java 中&#xff0c;super关键字主要有以下作用&#xff1a; 在子类构造方法中调用父类的构造方法&#xff1a;使用super关键字可以在子类的构造方法中显式调用父类的构造方法&#xff0c;以便继承父类的属性和行为。语法如下&#xff1a;这样可以确保父类的构造方法被正确…

Sora:AI视频生成的新机遇与挑战

随着科技的飞速进步&#xff0c;人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;技术已经深入渗透到社会的各个领域。其中&#xff0c;Sora这类基于AI的视频生成工具因其高度逼真的生成能力而备受瞩目。然而&#xff0c;正如一枚硬币有两面&#xff0…

Vue+Vue CLI学习

1、Vue基础 1.1、Vue简介 &#xff08;1&#xff09;Javascript框架 &#xff08;2&#xff09;简化Dom操作 &#xff08;3&#xff09;响应式数据驱动 vue基础&#xff1b;vue-cli;vue-router;vuex;element-ui;vue3 vue文件包括html、css、js 1.2、第一个Vue程序 Vue …

python异常机制

当代码出现异常后底下代码都不会被执行了&#xff0c;也就是程序崩溃了。当然能避免异常的话尽量避免但是有的时候这个是没有办法避免的。 异常处理 &#xff08;注&#xff1a;异常处理是从上往下处理&#xff0c;所以编写代码时要注意&#xff09; 语法 try:可能出现异常…

ospf虚链路实验简述

1、ospf虚链路实验简述 ospf虚链路配置 为解决普通区域不在骨干区域旁&#xff0c;通过配置Vlink-peer实现不同区域网络设备之间建立逻辑上的连接。 实验拓扑图 r1: sys sysname r1 undo info enable int loopb 0 ip add 1.1.1.1 32 ip add 200.200.200.200 32 quit int e0/0/…

(sub)三次握手四次挥手

TCP的三次握手与四次挥手理解及面试题 序列号seq&#xff1a;占4个字节&#xff0c;用来标记数据段的顺序&#xff0c;TCP把连接中发送的所有数据字节都编上一个序号&#xff0c;第一个字节的编号由本地随机产生&#xff1b;给字节编上序号后&#xff0c;就给每一个报文段指派一…

男人的玩具系统wordpress外贸网站主题模板

垂钓用品wordpress外贸模板 鱼饵、鱼竿、支架、钓箱、渔线轮、鱼竿等垂钓用品wordpress外贸模板。 https://www.jianzhanpress.com/?p3973 身体清洁wordpress外贸网站模板 浴盐、防蚊液、足部护理、沐浴液、洗手液、泡澡用品wordpress外贸网站模板。 https://www.jianzhan…

Spring揭秘:BeanDefinitionRegistry应用场景及实现原理!

内容概要 BeanDefinitionRegistry接口提供了灵活且强大的Bean定义管理能力&#xff0c;通过该接口&#xff0c;开发者可以动态地注册、检索和移除Bean定义&#xff0c;使得Spring容器在应对复杂应用场景时更加游刃有余&#xff0c;增强了Spring容器的可扩展性和动态性&#xf…

鸿蒙ArkTS语言快速入门-TS(一)

ArkTS与TS的学习 ArkTS与TS的关系简述TypeScript&#xff08;TS&#xff09;简述基础类型1&#xff0c;let2&#xff0c;const3&#xff0c;布尔类型4&#xff0c;数字number5&#xff0c;字符串string6&#xff0c;数组Array7&#xff0c;元组 Tuple8&#xff0c;枚举 enum9&a…

【设计模式 05】原型模式

有的时候&#xff0c;我们创建对象&#xff0c;需要耗费大量时间在一些资源型操作上&#xff0c;这个时候&#xff0c;我们就可以先创建出一个模板&#xff0c;然后每次创建的时候直接从模板复制即可&#xff0c;不用反复进行耗时的资源型操作。 python代码&#xff1a; impo…

Vue-Router使用

1.安装 npm install vue-router4 2. 添加路由 新建router文件夹&#xff0c;新建文件 index.ts import { createRouter, createWebHashHistory,createWebHistory} from "vue-router";const routes [{path: /login,component: () > import("../views/Logi…

18个惊艳的可视化大屏(第19辑):工业制造、智能工厂

实时监控和数据展示 可视化大屏可以集成和展示各种传感器、设备和系统的实时数据。通过将数据可视化展示在大屏上&#xff0c;工厂管理人员可以实时监控生产线的状态、设备的运行情况、生产效率等重要指标。这有助于及时发现问题、做出决策&#xff0c;并提高生产效率和质量。…

粉色ui微信小程序源码/背景图/头像/壁纸小程序源码带流量主

云开发版粉色UI微信小程序源码&#xff0c;背景图、头像、壁纸小程序源码&#xff0c;带流量主功能。 云开发小程序源码无需服务器和域名即可搭建小程序另外还带有流量主功能噢&#xff01;微信平台注册小程序就可以了。 这套粉色UI非常的好看&#xff0c;里面保护有背景图、…

数学建模【模糊综合评价分析】

一、模糊综合评价分析简介 提到模糊综合评价分析&#xff0c;就先得知道模糊数学。1965年美国控制论学家L.A.Zadeh发表的论文“Fuzzy sets”标志着模糊数学的诞生。 模糊数学又称Fuzzy数学&#xff0c;是研究和处理模糊性现象的一种数学理论和方法。模糊性数学发展的主流是在…

C++:拷贝构造函数

1.概念 在现实生活中&#xff0c;可能存在一个与你一样的自己&#xff0c;我们称之为双胞胎。那在创建对象的时候&#xff0c;可否创建一个与已存在对象一模一样的新对象呢&#xff1f;答案是可以的&#xff0c;这就要通过拷贝构造函数来实现了。 拷贝构造函数&#xff1a;只有…

Go-Gin-example 第五部分 加入swagger

上一节链接 swagger 为什么要用swagger 问题起源于 前后端分离&#xff0c; 后端&#xff1a;后端控制层&#xff0c;服务层&#xff0c;数据访问层【后端团队】前端&#xff1a;前端控制层&#xff0c;视图层&#xff0c;【前端团队】 所以产生问题&#xff1a;前后端联调…

基类指针指向派生类对象,基类不带虚函数,子类带虚函数产生的异常分析

基类指针指向派生类对象&#xff0c;基类不带虚函数&#xff0c;子类带虚函数产生的异常分析 基类指针指向派生类对象&#xff0c;指针的起始地址一定是指向基类起始地址的 这种情况下&#xff0c;当基类没有虚函数&#xff0c;而子类存在虚函数时&#xff0c;就会出现问题&am…