【Linux】重定向
1、理解重定向在task_struct结构体中存放files_struct*指针指向本进程的文件描述符表fd_array文件描述符的分配规则是从下标0开始找值最小并且没有被使用的位置正常程序默认打开0、1、2这三个位置全部被占用默认起始下标为3如果先执行close(2)那么起始下标就为2#includestdio.h#includesys/types.h#includesys/stat.h#includefcntl.h#includeunistd.h#includestring.hintmain(){close(2);intfdaopen(log.txt,O_WRONLY|O_CREAT|O_TRUNC,0666);printf(fda: %d\n,fda);intfdbopen(log.txt,O_WRONLY|O_CREAT|O_TRUNC,0666);printf(fdb: %d\n,fdb);intfdcopen(log.txt,O_WRONLY|O_CREAT|O_TRUNC,0666);printf(fdc: %d\n,fdc);return0;}1为显示器输出如果把1号下标对应的文件关闭那么将产生输出重定向#includestdio.h#includesys/types.h#includesys/stat.h#includefcntl.h#includeunistd.h#includestring.hintmain(){close(1);intfdaopen(log.txt,O_WRONLY|O_CREAT|O_TRUNC,0666);printf(fda: %d\n,fda);intfdbopen(log.txt,O_WRONLY|O_CREAT|O_TRUNC,0666);printf(fdb: %d\n,fdb);intfdcopen(log.txt,O_WRONLY|O_CREAT|O_TRUNC,0666);printf(fdc: %d\n,fdc);return0;}当运行operfile程序时无输出内容全部写入了log.txt中完成输出重定向文件描述符1这个编号从绑定屏幕改成了绑定log.txtfd[1]中存储的内容指向了log.txt的内容并且操作系统更改1的指向后语言层并不知道stdout封装1后语言层只认数字1所以重定向的本质是更改数组特定下标内的内容2、dup2dup2为系统调用的重定向函数函数定义intdup2(intoldfd,intnewfd);将newfd变成oldfd的副本如果newfd原本打开了资源会先自动关闭newfddup2实现重定向的方式不是先关闭文件描述符再打开一个文件而是将oldfd下标里存储的文件拷贝到newfd中#includestdio.h#includesys/types.h#includesys/stat.h#includefcntl.h#includeunistd.h#includestring.hintmain(){// close(1); 注释掉不手动关闭标准输出fd1intfdaopen(log.txt,O_WRONLY|O_CREAT|O_TRUNC,0666);printf(fda: %d\n,fda);// 输出 3dup2(fda,1);// fd1现在指向log.txt内容写入文件printf(aaaaaa);printf(aaaaaa);printf(aaaaaa);fprintf(stdout,aaaaaa\n);return0;}dup2让fd1复制fda指向的文件实现标准输出重定向把O_TRUNC替换成O_APPEND可以实现追加重定向3、输入重定向使用cat命令时cat会从键盘读取数据但输入重定向后会从log.txt中读取内容#includestdio.h#includesys/types.h#includesys/stat.h#includefcntl.h#includeunistd.h#includestring.hintmain(){intfdopen(log.txt,O_RDONLY);printf(fd: %d\n,fd);dup2(fd,0);// 从标准输入读取数据charbuf[64];fgets(buf,sizeof(buf),stdin);printf(读取到文件内容%s,buf);close(fd);return0;}dup2(fd, 0);把打开的文件fd覆盖掉0号文件描述符之后所有读 stdin 的操作不再读键盘而是读log.txt这就是程序内部实现输入重定向4、理解一切皆文件键盘、显示器、网卡、硬盘等硬件底层读写逻辑完全不相同为什么上层可以统一用同一个接口每次打开一个文件或设备时内核都会创建一个独立的struct file对象内部有函数指针数组操作系统向上层应用提供统一的IO接口通过内核struct file 驱动函数指针把磁盘文件、键盘、显示器、网卡、管道、套接字全部抽象成文件统一管理。所以应用层调用open或write等函数时会通过fd下标找到进程文件描述符表拿到struct file*自动跳转到底层硬件驱动专属方法上层应用完全不用区分硬件类型接口是统一的

相关新闻

病理报告文书太耗时、又不敢让AI碰诊断怎么办?UPMC把智能体锁死在文书层:94例活检结构识别100%、零幻觉诊断,出报告从76秒压到39秒

病理报告文书太耗时、又不敢让AI碰诊断怎么办?UPMC把智能体锁死在文书层:94例活检结构识别100%、零幻觉诊断,出报告从76秒压到39秒

一、研究背景 关于医疗 AI 智能体,过去一年出现了大量令人兴奋的论文:能自主问诊的、能推理罕见病的、能模拟移植委员会的。但把这些成果放到医院信息科的视角下看,会发现一个共同的尴尬——它们几乎都跑在实验环境里。 论文里的智能体&#…

2026/9/15 11:56:59 阅读更多 →
Unity中实现逼真水浮力效果:从物理原理到性能优化实战

Unity中实现逼真水浮力效果:从物理原理到性能优化实战

1. 项目概述:为什么“水浮力”是Unity开发中的硬骨头?在Unity里做水,很多开发者都卡在“浮力”这个环节。你可能会觉得,不就是让物体在水里漂起来吗?加个向上的力不就行了?但实际动手你会发现,事…

2026/9/5 10:08:49 阅读更多 →
2026年想给无锡学生选专业课桌椅?哪家机构靠谱看这里!

2026年想给无锡学生选专业课桌椅?哪家机构靠谱看这里!

在为无锡的学生挑选专业课桌椅时,选择一家靠谱的机构至关重要。合适的桌椅不仅能提升学生的学习体验和效率,还对学生的身体健康有着积极的影响。今天就来给大家推荐一家值得考虑的机构——无锡唯好办公,同时分享一些挑选专业课桌椅的要点。一…

2026/9/10 19:05:46 阅读更多 →

最新新闻

openEuler 20.03 TigerVNC 远程桌面安装与排障全记录

openEuler 20.03 TigerVNC 远程桌面安装与排障全记录

平时在信创环境里折腾系统,最烦的就是机房没显示器、服务器却装了图形界面,或者某个研发非要在远程看一眼Oracle安装器的图形输出。我这次在openEuler 20.03上装TigerVNC,本来以为就是个普通的yum install,结果前后折腾了小半天&a…

2026/9/15 11:59:53 阅读更多 →
MQ消息积压排查与消费速度优化:从线程Dump到批量消费完整指南

MQ消息积压排查与消费速度优化:从线程Dump到批量消费完整指南

凌晨两点,告警群突然炸了:某核心业务的MQ消费延迟从几百毫秒飙升到三小时,积压消息数像坐了火箭一样往上涨。我打开监控面板扫了一眼,消费组的Lag曲线几乎垂直向上,而消费速率已经跌到接近零。那一刻心里很清楚&#x…

2026/9/15 11:59:53 阅读更多 →
JDK28值类与Spring Boot4.1响应式升级实战指南

JDK28值类与Spring Boot4.1响应式升级实战指南

1. 这不是一份“新闻简报”,而是一份JVM生态实战者的手记Java周刊2026W35这个标题,表面看是时间戳版本号的堆砌,但如果你真在一线写业务、搭平台、调性能,就会立刻意识到:这一期不是更新日志,而是JVM技术栈…

2026/9/15 11:59:53 阅读更多 →
DevEco CLI实战:从命令行构建到上架鸿蒙宝贝日程表App

DevEco CLI实战:从命令行构建到上架鸿蒙宝贝日程表App

最近在给家里小朋友做一款鸿蒙原生的「宝贝日程表」App,整个过程从命令行创建工程一路做到正式上架,就是用 DevEco CLI 这套命令行工具链完成的。这个项目本身不复杂,但正好把一个鸿蒙 App 从 0 到 1 的关键链路全跑了一遍:工程初…

2026/9/15 11:59:53 阅读更多 →
EIP-7623 深度解析:以太坊 calldata 成本上调如何将最大区块大小从 1.79 MB 压至 0.72 MB

EIP-7623 深度解析:以太坊 calldata 成本上调如何将最大区块大小从 1.79 MB 压至 0.72 MB

EIP-7623 深度解析:以太坊 calldata 成本上调如何将最大区块大小从 1.79 MB 压至 0.72 MB 【免费下载链接】EIPs The Ethereum Improvement Proposal repository 项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs 导读:本文以以太坊改进提案…

2026/9/15 11:59:53 阅读更多 →
使用 Rube MCP 在 Codex 中自动化 Supadata 数据操作:Composio 工具链实战指南

使用 Rube MCP 在 Codex 中自动化 Supadata 数据操作:Composio 工具链实战指南

使用 Rube MCP 在 Codex 中自动化 Supadata 数据操作:Composio 工具链实战指南 【免费下载链接】awesome-codex-skills A curated list of practical Codex skills for automating workflows across the Codex CLI and API. 项目地址: https://gitcode.com/GitHub…

2026/9/15 11:58:53 阅读更多 →

日新闻

Java高级技术:从语言特性到性能优化全解析

Java高级技术:从语言特性到性能优化全解析

1. Java高级技术概述Java作为一门成熟的编程语言,经过二十多年的发展已经形成了完整的生态系统。在企业级应用开发、大数据处理、移动开发等领域,Java都占据着重要地位。掌握Java高级技术不仅意味着能够编写更高效的代码,更代表着开发者能够解…

2026/9/15 0:00:23 阅读更多 →
C#与Halcon结合的工业视觉处理实战指南

C#与Halcon结合的工业视觉处理实战指南

1. 项目概述:C#与Halcon强强联合的视觉处理利器这个基于C#和Halcon的视觉处理Demo项目,是我在工业质检领域摸爬滚打多年后提炼出的实战精华。它完美融合了C#的界面开发优势与Halcon强大的图像处理能力,就像给视觉工程师配上了一把瑞士军刀。项…

2026/9/15 0:00:23 阅读更多 →
32路工业串口服务器的硬核选型指南:确定性、鲁棒性与协议下沉

32路工业串口服务器的硬核选型指南:确定性、鲁棒性与协议下沉

1. 为什么“32路复合型”不是营销话术,而是工业现场真实痛点的硬解你有没有遇到过这样的场景:在某大型能源站的PLC机柜里,十几台不同年代、不同品牌的温控仪、电表、气体分析仪、阀门控制器,全靠RS-485总线挂在一根线上&#xff0…

2026/9/15 0:00:23 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/14 5:45:49 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/15 1:32:25 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/15 1:32:21 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/14 17:35:10 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/14 16:59:29 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/14 5:45:14 阅读更多 →