Linux--重定向

1、如何理解重定向?

(1)关掉0之后

运行结果:

(2)close 2 之后。

所以在Linux中文件描述符的分配规则是什么呢?

分配文件描述符表中,值最小并且没有被使用的fd。

进程文件管理结构--进程文件描述表结构与标准输入输出原理

进程要使用磁盘中的文件,会先将文件加载到内存,再由CPU通过进程调度来处理这些文件;每个进程的PCB(即task_struct)中都有一个files指针,专门指向files_struct这个文件描述符表,表内的fd_array数组负责管理进程打开的所有文件,数组下标0、1、2固定对应标准输入、标准输出和标准错误,这就是进程管理文件的核心内核结构。

关闭文件描述符1后printf无法屏幕输出的原因

关闭文件描述符1后,原本指向标准输出的fd_array1被清空,再调用open时内核会将这个空闲的1号描述符重新分配给新文件,此时printf依然向1号描述符输出数据,却不再输出到屏幕而是写入文件,因此屏幕上看不到打印内容。

重定向的本质是:其实就是改掉数组特定的下标内的内容。

dup2使用方法

函数含义:dup2(旧fd, 新fd);

  • 把旧fd 的指向,复制给 新fd

  • 新fd 会被改掉,旧fd 不变

记住一句话:

谁在后面,谁被改;

前面不动,后面跟前面走。

举例

  1. dup2(3, 1)
  • 3 → 文件

  • 结果:1 也指向文件(屏幕变文件)

  1. dup2(1, 3)
  • 1 → 屏幕

  • 结果:3 也指向屏幕(原来的文件被替换)

作用

用来重定向输入/输出,让本来写给屏幕/键盘的数据,改写到文件或别的地方。

重定向的本质是:修改文件描述符的指向

程序替换不会影响进程打开的文件。

如何理解Linux下一切皆文件?

一句话总结

Linux"一切皆文件"的核心:用统一的文件接口( read / write 等)抽象所有资源,让应用层无需关心底层差异。

核心要点

  1. 统一抽象:将普通文件、硬件设备、进程通信、内核数据等,都抽象为文件对象,通过 struct file 提供统一的操作接口。

  2. 分层实现:上层是统一的 read / write 调用,下层由不同设备驱动(如 read_keyboard 、 write_screen )完成实际操作,实现"上层统一,下层各异"。

  3. 核心价值:简化编程、灵活组合(如重定向)、统一权限管理,让系统设计更简洁高效。

也就是说,

每个设备对应一个 struct file 结构体,结构体里的 read / write 等函数指针,会绑定到该设备驱动的具体实现;当调用通用的文件操作接口时,就会通过这些指针触发对应硬件的专属功能。

Linux "一切皆文件"的核心实现机制,其本质是通过统一抽象 + 多态分发来管理所有硬件和资源:

  1. 统一抽象层(基类):内核为所有打开的硬件(键盘、屏幕、网卡等)创建统一的 struct file 结构体,对外提供 read() 、 write() 等统一的文件操作接口,让应用层无需关心底层差异。

  2. 具体实现层(子类):每种设备都有专属的驱动函数(如 read_keyboard() 、 write_screen() ),这些函数是对底层硬件操作的具体实现,对应图中的"子类"。

  3. 多态分发机制: struct file 内部的函数指针会在设备初始化时,被绑定到对应设备驱动的具体实现函数上。当应用程序调用统一的 read / write 接口时,内核会通过文件描述符找到对应的 struct file ,再通过函数指针间接调用到底层驱动的专属函数,从而实现"上层统一调用,底层差异执行"的多态效果。

简单来说,就是用一套统一的"文件操作"门面,把底层硬件的差异全部封装起来,让所有资源都能像文件一样被高效、一致地管理和使用。

相关推荐
CALL158119098459 分钟前
SVHC 247项与附录XVII限制物质,REACH测试项目有哪些?
运维·安全·安全性测试
对空六课10 分钟前
指标口径生效时间的版本查询实现
大数据·服务器·前端·算法·数据分析
flytalei12 分钟前
Ubuntu 24.04 单节点 K3s 部署实践:从环境评估到故障排查与验收
linux·运维·ubuntu
对空六课15 分钟前
RFM分层边界变化的回溯计算
大数据·服务器·前端·数据库·人工智能·算法·数据分析
Starry-sky(jing)34 分钟前
Hermes Agent 部署后怎么升级?v0.21.7 Linux 源代码版实测
linux·人工智能·ai agent·版本升级·hermes agent
CableTech_SQH35 分钟前
行业运维新标杆:百盛3D全场景运维系统
运维·数据库·信息与通信·综合布线
水饺编程37 分钟前
第2章:Linux 基础,clear 命令
linux·c语言·汇编
程序猿老A1 小时前
云服务器ECS怎么配置多IP?
运维·服务器·tcp/ip
Canmag 兴隆磁性1 小时前
磁材包装产线自动化实践:自动定量装袋设备的原理、结构与选型思路
运维·自动化·永磁材料·包装
Dreamboat-L1 小时前
日志级别基础 + Spring Boot 日志实践指南
java·服务器·数据库·java-ee·springboot