[linux]文件描述符再探

Linux:dup/dup2 文件描述符重定向函数(有图有代码有真相!!!) 一、dup/dup2 有时我们希望把标准输入重定向到一个文件,或者把标准输出重定向到一个网络连接。系统调用dup和dup2能够复制文件描述符。dup返回新的文件文件描述符(没有用的文件描述符最小的编号)。 dup2可以让用户指定返回的文件描述符的值,如果需要,则首先接近newfd的值,他通常用来重新打开或者重定向一个文件描述符。 1、dup函数 dup函 阅读详情

第一点也是最重要的一点:在linux上所有的硬件挂载/dev/mouse,pipe,文件,socket等都是文件!都是可以通过文件描述符来访问到的。


文件描述符file descriptor:是一个对文件的索引号,可以认为是一个公司里面的员工id号,通过id可以索引到员工,然后对员工进行一些操作。

首先要理解文件描述符,得有如下3个内核所维护的数据结构概念:

1.进程级的文件描述符

2.系统级的打开文件表

3.文件系统的i-node表


进程级的文件描述符:

针对于每一个进程,内核都会维护打开文件的描述符表,表中的每一条记录都记录了单个文件的相关信息,控制文件描述操作的标志,对打开句柄的引用,这里的句柄是指系统级打开文件表中的条目。


系统级的打开文件表:

内核对所有打开的文件维护一个系统级的文件打开表,并将表中的各条目称之为打开句柄。一个句柄存储了打开文件的相关信息。包括文件偏移,打开文件状态flags,文件的访问模式,信号驱动I/O相关设置,对文件系统中的i-node的引用。


文件系统的i-node表:

目前linux的文件系统已经到了ext4,想知道自己系统的文件系统是什么 可以使用

df -aT
进行查看。一个文件在linux中可以有属性,权限,数据信息。ext文件系统通畅将这两部分的数据分别存放在不同的快,权限和属性放在inode中,实际数据则放在data block中。

一个文件会占用一个inode,inode记录文件的数据所在的block号码。如下图所示:


假设一个文件存放在inode4号,而这个文件实际放在了2,7,13,15这四个data block中,此时操作系统读出四个block就能将文件内容读出。




在程序中一个默认使用了3个文件描述符 0 ~ 2, 标准输入输出错误:STDIN_FILENO = 0,STDOUT_FILENO = 1,STDERR_FILENO = 2。

当用

int open(char* name,int flags,.../* mode_t mode */);
当开一个文件的时候,会返回最低的未使用的文件描述符序号,当标准输入,输出,错误被占用的情况下,将返回3;


上图中进程A的文件描述符fd 1 和 20是指向同一个句柄,这可能是因为使用了dup(),dup2(),fcntl()函数产生的

进程A的文件描述符 fd 2和 进程B的文件描述符 fd 2都指向同一个句柄,这可能是因为执行fork()之后,产生的内存拷贝,即A和B是父子进程关系,继承来的。

进程A的文件描述符 fd 0 和 进程B的文件描述符 fd 3 指向不同的句柄,但是指向同一个inode,可能是因为都打开了同一个文件,同一个进程两次打开一个文件也会发生这种情况。


总结:两个不同的文件描述符,若指向同一个打开文件句柄,则共享偏移,即通过一个文件描述符更改内容,另外一个文件描述符也是可以观察到的。


那么两条命令行

./run_script >result.log 2>result.log

./run_script >result.log 2>&1

第一条命令行 相当于 创建了两个文件描述符,但是不共享句柄,即偏移不共享,这就会产生十分怪异的情况,即输出结果是乱序的

第二条命两行 将文件描述符复制标准输入文件描述符,共享句柄,共享偏移,输出结果和控制台输出结果是一致的。

复制描述符 可以用

int dup(int oldfd);
int dup2(int oldfd,int newfd);

dup()函数会复制一个文件描述符,返回一个指向相同句柄的新文件描述符,新文件描述符从最低未使用的描述符选择。

比如:

close(STDIN_FILENO);
newfd = dup(STDOUT_FILENO);
这个时候 newfd就是0。因为标准输入所占用的文件描述符为0,这个时候关闭了,0变成未使用,那么dup之后将使得newfd将变成0即最小未使用的文件描述符。

dup2()所执行的功能即 若是指定的新的文件描述符存在,则关闭,然后返回,否则直接返回。




Linux下的文件描述符 在 Linux 的世界里,一切设备皆文件。对文件的操作都是通过文件描述符(fd)来进行的。Linux 中有7中文件类型:我们可以通过 Il 命令来查看文件类型: **文件描述符相当于非负的索引。**我们可以通过文件描述符操作相应的文件。Linux进程会默认打开三个文件描述符:文件描述符的分配原则:分配出未被占用的最小文件描述符。 一般来说,我们打开文件后占用一个文件描述符3(0、1、2已被标准文件描述符占用),下一个则是4(如果它没被占用的话)… 运行结果: 我们观察上述代码可以发现:同一个进程的不同文件描 阅读详情

相关推荐

课程复习---分析空间数据的细胞空间关系(python版本的mistyR)

课程复习---分析空间数据的细胞空间关系(python版本的mistyR)

weixin_53637133的博客 1221

文件描述符与文件指针

一. 什么是文件描述符(fd) 文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。文件描述符的有效范围是 0 到 OPEN_MAX。 习惯上,标准输入(standard input)的文件描述符是 0,标准输出(standard output)是 1,标准错误

chenxucx的博客 703

NC65实现Restful接口开发及调试

NC65实现Restful接口开发及调试

linzhongshu的专栏 2144

dup与dup2函数详解

今天这里

bian_qing_quan11的博客 3058

SAR成像系列:【3】合成孔径雷达(SAR)的二维回波信号与简单距离多普勒(RD)算法 (附matlab代码)

二维回波信号分析

zr2006_7的专栏 2万+

LS-Dyna模态分析实战:从模型构建到结果解读的全流程指南

本文提供了一份详尽的LS-Dyna模态分析实战指南。文章系统讲解了如何利用LS-Dyna内置的隐式求解器进行特征值求解,从模型构建、几何清理、材料与连接设置,到核心的边界条件与隐式求解控制(如*CONTROL_IMPLICIT_EIGENVALUE),最后完成计算并解读频率与振型结果。旨在帮助工程师在熟悉的环境中高效完成结构振动特性分析,为后续动态响应分析奠定基础。

info6的博客 262

dup和dup2函数

我们都知道,一个进程在存在期间,会有一些文件被打开,从而会返回一些文件描述符,从shell中运行一个进程,默认会有3个文件描述符存在,即0,1,2.0与进程的标准输入相关联,1与进程的标准输出相关联,2与进程的标准输出错误相关联。dup和dup2函数用来复制一个文件的描述符,用于文件描述符的重定向,重定向一个进程的0,1,2文件描述符。这两个函数的...

weixin_34357928的博客 112

Rasa Core开发指南

文章目录1. Rasa Core简介1.1 Rasa Core消息处理流程1.2 安装Rasa Core2. Dialogue模型训练2.1 Story样本数据2.2 Domain2.2.0 intents2.2.1 actions2.2.2 templates2.2.3 entities2.2.4 slots3 .训练和使用对话模型3.1 训练对话模型3.2 使用对话模型4. 搭建CustomA...

老蒋也疯狂 1万+

dup、dup2实现文件描述符重定向(标准输入、标准输出、标准错误输出)

目录 dup函数 dup2函数 重定向标准输入 重定向标准输出 重定向标准错误输出 重定向恢复 总结 在前文中,可以知道,文件描述符实际上是指向文件表项的指针数组索引,也就相当于每个文件描述符都对应一个文件表项,最终对应一个文件,而文件描述符重定向,则是让一个文件描述符指向另一个特定的文件表项,最终使得不同的文件描述符指向同一个文件表项,常用到的函数就是dup、dup2以...

HerofH_的博客 1万+

HID设备开发避坑指南:如何利用Windows内置驱动快速实现USB键盘模拟

本文详细解析了HID设备开发中的免驱方案与USB键盘模拟技术,重点介绍了HID协议的核心优势、开发基础架构及Windows平台的实现方法。通过实战案例和代码示例,帮助开发者快速掌握USB键盘模拟技术,避免常见开发陷阱,提升设备兼容性和性能。

lambda的博客 682

全网最详细的UAVCAN/DroneCAN链路开发(官方DroneCAN消息+自定义DroneCAN消息)附DroneCAN项目源码

全网最详细的UAVCAN/DroneCAN链路移植开发(官方DroneCAN消息+自定义DroneCAN消息)附工程移植源码

Bit_Dong的博客 3233

Linux文件描述符到底是什么?

Linux 中一切皆文件,比如 C++ 源文件、视频文件、Shell脚本、可执行文件等,就连键盘、显示器、鼠标等硬件设备也都是文件。一个 Linux 进程可以打开成百上千个文件,为了表示和区分已经打开的文件,Linux 会给每个文件分配一个编号(一个 ID),这个编号就是一个整数,被称为文件描述符(File Descriptor)。这只是一个形象的比喻,为了让读者容易理解我才这么说。如果你也仅仅理...

天下 6459

详解大端模式和小端模式

详解大端模式和小端模式 一、大端模式和小端模式的起源         关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令

ce123的技术博客 19万+

Linux中的文件描述符

打开一个文件,系统做了大致如下几件事,首先CPU会寻找对应的struct task_struct(也就是进程PCB);struct task_struct中有许多的struct file_struct *files指针,这些指针指向的就是不同的文件结构体,而struct file_struct结构体中就记录着文件描述符(

k5426244的博客 5211

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Linux -文件描述符

通过dup2函数,可以将文件描述符与标准输入(stdin,文件描述符0)、标准输出(stdout,文件描述符1)和错误输出(stderr,文件描述符2)进行关联,实现输入输出的重定向。通过dup2函数,可以创建一个新的文件描述符,并复制旧的文件描述符的状态,使得两者指向同一个文件表项。此时,我们发现,本来应该输出到显示器上的内容,输出到了文件 myfile 当中,其中,fd=1。复制oldfd的文件表项到newfd:使得newfd和oldfd指向同一个文件表项,共享相同的文件偏移量和文件状态标志。

2301_79274600的博客 1112

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Linux:文件描述符详解

Linux中的所有进程,都拥有自己的文件描述符(File Descriptor, FD),它是操作系统在管理进程和文件时的一种抽象概念。每个文件描述符由一个非负整数表示,用来标识进程已打开的文件、输入输出流、网络套接字等资源。一个进程可以打开的文件描述符是有上限的,可以通过ulimit命令查询,如例1所示。

保持终身学习的能力,温故而知新 2238

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Linux 文件描述符

在 Linux 操作系统中,当一个应用程序或进程操作系统资源时,首先会触发文件调用事件,通过应用程序或进程发送一个调用文件的信号给操作系统内核,内核会在 打开文件表 中增加一条记录,同时将打开文件表中新增的记录返回给应用程序或进程,而应用程序或进程接收到来自内核返回的信息,称为文件描述符(file desrciption)。

ChenYX的博客 20万+

Linux下文件描述符

文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket。第一个打开的文件是0,第二个是1,依此类推。Unix操作系统通常给每个进程能打开的文件数量强加一个限制。更甚的是,unix通常有一个系统级的限制。在UNIX/Linux平台上,对于控制台(Console)的标准输入(0),标准输出(1),标准错误(2)输出也对应了三个文件描述符。   对于squid,因为squid 的

枯木的Linux专栏 1万+

Linux | 文件描述符

在 Linux 系统里,文件描述符(File Descriptor)是一个非负整数,它是对文件或者 I/O 设备(如键盘、显示器等)的抽象表示。当进程打开一个现有文件或者创建一个新文件时,内核会为该进程分配一个文件描述符,进程通过这个文件描述符来对文件进行各种操作,例如读取、写入、关闭等。每个进程都有一个对应的文件描述符表,文件描述符就是该表的索引。标准输入(stdin:文件描述符为 0,通常关联键盘,用于读取用户输入。标准输出(stdout:文件描述符为 1,通常关联显示器,用于输出信息。

TTKunn的博客 1665

Linux 文件描述符详解

Linux文件描述符详解:文件描述符是Linux系统中用于访问文件或I/O资源的整数标识符,提供统一接口操作不同资源。标准输入(0)、输出(1)和错误(2)是预定义描述符。可通过/proc/pid/fd查看,使用dup/dup2复制,通过重定向实现I/O控制。在编程中需注意关闭描述符避免泄漏,网络套接字和管道也通过描述符实现。合理管理文件描述符能提升程序性能和稳定性。

软件科学-郝学胜 1065

【Linux】浅谈文件描述符和重定向

浅谈文件描述符和重定向

DanteKing的博客 2476

Linux——什么是文件描述符

在语言和系统的学习中,IO流的学习是绕不开的,在其中我们会学到文件的打开,关闭,读取,写入等操作,而在这里面当文件被系统打开后,要怎么管理这些打开的文件呢?这时候就需要用到文件描述符来管理这些被打开的文件。

zcxmjw的博客 1554

Linux Shell文件描述符和重定向

Linux操作系统中,Shell文件描述符和重定向是用于管理进程输入输出的重要概念。本文旨在深入探讨文件描述符和重定向的工作原理、用法,以及它们如何帮助进行高效的数据流管理。

常备不懈 2021

Linux文件描述符详解

文章目录一、概念二、手动创建文件描述符`2.1.语法`2.1.1.创建2.1.2.调用2.1.3.关闭`2.2.重定向输出的文件描述符``2.3.重定向输入的文件描述符``2.4.既可以输出又可以输入的文件描述符`三、使用read命令读取文件描述符 参考书籍:《Linux Shell核心编程指南》——丁明一 一、概念 文件描述符是一个非负整数,内核需要通过这个文件描述符才可以访问文件 文件描述符好比一本书的目录(索引),通过这个索引可以找到需要的内容 在Linux系统中内核默认为每个进程创建三个标准的文

运维@小兵的博客 2846
上一篇: [linux]tee命令以及实现
下一篇: [linux]程序和进程浅析
HeapStackk
博客等级 码龄12年 11粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值