当前位置: 首页 > article >正文

标准输入流,输出流,错误流 以及 重定向 的原理

标准输入流、输出流、错误流在操作系统与C语言中的表达1. 操作系统层面Linux/Unix在操作系统层面标准输入、标准输出和标准错误流通过文件描述符File Descriptor来标识流类型文件描述符 (fd)默认设备标准输入0通常是终端/键盘标准输出1通常是终端/屏幕标准错误2通常是终端/屏幕这些文件描述符本质上是进程打开的文件句柄可以指向终端设备、普通文件或管道。2. C语言层面在C语言中标准库stdio.h提供了三个预定义的FILE*指针#includestdio.h// 三种标准流指针stdin// 标准输入流stdout// 标准输出流stderr// 标准错误流对应关系C语言流文件描述符说明stdin0fgets()、scanf() 从此读取stdout1printf()、puts() 往此写入有缓冲stderr2fprintf(stderr, …) 往此写入无缓冲示例代码#includestdio.h#includeunistd.h// for close()intmain(){// C语言方式使用标准流fprintf(stdout,正常输出\n);fprintf(stderr,错误信息\n);// 获取底层文件描述符intfd_infileno(stdin);// 0intfd_outfileno(stdout);// 1intfd_errfileno(stderr);// 2// 直接使用系统调用写入write(fd_out,hello\n,6);return0;}3. stdout 与 stderr 的关键区别特性stdoutstderr缓冲有缓冲行缓冲或全缓冲无缓冲立即写出用途程序正常输出错误/诊断信息重定向可单独重定向可单独重定向重定向示例# 只重定向 stdout 到文件./progoutput.txt# 只重定向 stderr 到文件./prog2error.log# 将 stdout 和 stderr 都重定向到同一文件./progall.txt214. 重定向的实现原理./prog output.txt这个重定向是如何实现的这是通过shell 在调用程序前修改文件描述符实现的。核心机制如下是 shell 的语法不是程序本身的行为shell 会打开目标文件把文件的文件描述符设为 1标准输出再执行你的程序程序看到的 fd 1 已经不是终端而是文件了用系统调用还原./prog output.txt// shell 实际做的事简化版pid_tpidfork();if(pid0){// 子进程执行重定向intfdopen(output.txt,O_WRONLY|O_CREAT|O_TRUNC,0644);dup2(fd,1);// 让 fd 1 指向文件close(fd);// 执行目标程序execvp(./prog,argv);}dup2(fd, 1)的作用是让文件描述符 1 和 fd 指向同一个文件。之后程序里所有的printf()、write(1, ...)都写到文件里了。验证实验// test.c#includestdio.h#includeunistd.hintmain(){printf(hello\n);// 走 stdout (fd 1)write(1,world\n,6);// 直接写 fd 1return0;}$ gcc test.c-otest$ ./test# 输出到屏幕$ ./testout.txt# 输出到文件$catout.txt# 输出hello\nworld\n程序代码完全没变变的只是 shell 在 exec 前把 fd 1 换成了文件。5. 重定向的恢复问题dup2(fd, 1)后何时重新把 1 指回标准输出流不会自动指回来——重定向的影响会持续到这个进程结束。dup2(fd, 1)之后这个进程的 fd 1 就永远指向文件了直到进程退出所有文件描述符自动关闭进程自己再用dup2()改回去shell 为什么能恢复因为 shell 是在子进程中做重定向------------------ | 父 shell 进程 | | fd 1 终端 | ← 从来不会被改变 ------------------ | fork() | v ------------------ | 子进程 | | fd 1 终端 | ← 刚 fork 时继承自父进程 | dup2(fd, 1) | | fd 1 文件 | ← 只有子进程被改了 | exec(./prog) | ------------------ | 退出 v 子进程销毁fd 全部关闭父 shell 的 fd 1 一直是终端不受影响。在程序内部恢复的方法如果想在程序内部恢复可以在重定向前先保存原来的 fd 1#includestdio.h#includeunistd.h#includefcntl.hintmain(){// 保存原始标准输出intsaved_stdoutdup(1);// 复制 fd 1得到比如 fd 3// 重定向到文件intfdopen(output.txt,O_WRONLY|O_CREAT|O_TRUNC,0644);dup2(fd,1);close(fd);// ... 现在 printf 都写到文件 ...printf(写入文件\n);// 恢复标准输出dup2(saved_stdout,1);// 把 fd 1 改回原来的终端close(saved_stdout);// ... 现在 printf 又写到屏幕了 ...printf(回到屏幕\n);return0;}6. 总结场景何时恢复shell 重定向 (./prog out.txt)子进程退出父进程从未受影响程序内自己dup2重定向不会自动恢复需要手动dup2(saved_fd, 1)通过理解文件描述符、标准流和重定向机制可以更好地掌握Linux/Unix系统编程和C语言中I/O操作的本质。

相关文章:

标准输入流,输出流,错误流 以及 重定向 的原理

标准输入流、输出流、错误流在操作系统与C语言中的表达 1. 操作系统层面(Linux/Unix) 在操作系统层面,标准输入、标准输出和标准错误流通过文件描述符(File Descriptor) 来标识:流类型文件描述符 (fd)默认设…...

告别折腾:用 apt 和 Qt 官方安装器两种方式在 Debian 上搞定 Qt 5.15.2 开发环境

在 Debian 上搭建 Qt 5.15.2 开发环境的双轨方案 对于需要在 Debian 系统上建立 Qt 开发环境的工程师来说,选择正确的安装方式往往比安装本身更重要。本文将深入探讨两种主流方案:Debian 官方仓库的 apt 安装和 Qt 官方在线安装器,帮助您根据…...

软硬一体赋能企业守护力,可穿戴手环构建员工数字健康管理新范式

在数字化转型深入推进的当下,员工健康已成为企业安全生产、高效运营的核心基石。传统健康管理模式存在数据零散、监测滞后、人工成本高、风险预警不及时等痛点,尤其铁路、港口、政企单位、生产型企业,一线员工高强度作业、慢病高发、突发健康…...

别再怪BGA了!从X光图到金相分析,手把手教你排查PCB上那颗‘时好时坏’的芯片

从X光到金相切片:BGA虚焊故障的硬核排查指南 当你反复调试一块核心板时,那个诡异的BGA芯片就像在和你玩捉迷藏——用力按压时系统运行正常,松开手立刻故障重现。这种"时好时坏"的症状,往往让硬件工程师们抓狂。本文将带…...

别再混淆了!一文理清华为云Stack里FusionStorage、OceanStor Pacific与存储服务的对应关系

华为云Stack存储产品演进史:从FusionStorage到OceanStor Pacific的技术脉络解析 在云计算基础设施领域,存储系统的命名规则往往反映了技术架构的迭代路径。华为云Stack作为企业级混合云解决方案,其存储产品线经历了多次重大技术革新与品牌整合…...

本地Perplexity服务突然中断?:排查systemd服务崩溃、GPU显存溢出与模型权重校验失败的5分钟应急清单

更多请点击: https://codechina.net 第一章:Perplexity本地服务查询 Perplexity 作为一款强调实时信息溯源与多源验证的 AI 助手,其官方未提供公开的本地化部署方案。但开发者可通过构建轻量级本地代理服务,模拟 Perplexity 的查…...

【独家逆向工程实录】:从Perplexity官网前端JS中提取未开放股票接口,附Python动态Token生成脚本

更多请点击: https://codechina.net 第一章:Perplexity股票信息检索 Perplexity AI 公司尚未上市,因此在主流证券交易所(如NYSE、NASDAQ)中并无对应的股票代码或实时行情数据。这一事实对开发者和金融数据集成场景具有…...

JPEXS Free Flash Decompiler终极指南:轻松替换SWF字体解决兼容性问题

JPEXS Free Flash Decompiler终极指南:轻松替换SWF字体解决兼容性问题 【免费下载链接】jpexs-decompiler JPEXS Free Flash Decompiler 项目地址: https://gitcode.com/gh_mirrors/jp/jpexs-decompiler 你是否曾遇到过SWF文件中的字体在不同设备上显示异常&…...

【Perplexity商业新闻搜索实战指南】:2024年最高效情报获取法,3步锁定竞对动态与市场拐点

更多请点击: https://codechina.net 第一章:Perplexity商业新闻搜索的核心价值与定位 Perplexity 商业新闻搜索并非传统聚合型RSS阅读器,而是一个以语义理解与实时可信信源协同驱动的智能情报引擎。它专为投资者、企业战略团队与合规分析师设…...

最近被黑产盯上了,用我的帐号发了duboo信息,这不是我发的

...

用Logisim从零搭建一个8位求补器:手把手教你理解补码的硬件实现

用Logisim从零搭建一个8位求补器:手把手教你理解补码的硬件实现 数字电路设计中最精妙的概念之一,莫过于补码表示法。它不仅解决了计算机中正负数的统一表示问题,还让加减法运算可以用同一套电路完成。但你是否好奇过,这个看似简单…...

从“会响”到“可靠”:给这个经典12V降5V电路加个二极管和电容,稳定性提升不止一点点

从“会响”到“可靠”:经典12V降5V电路的稳定性优化实战 当你在面包板上搭建好那个经典的稳压管NPN降压电路,看着万用表显示稳定的5V输出时,或许会感到一丝成就感。但当你接上负载,发现电压开始波动,或者在电源反接时闻…...

如何快速部署AI视觉瞄准系统:3个版本满足不同需求的终极指南

如何快速部署AI视觉瞄准系统:3个版本满足不同需求的终极指南 【免费下载链接】AI-Aimbot Worlds Best AI Aimbot - CS2, Valorant, Fortnite, APEX, every game 项目地址: https://gitcode.com/gh_mirrors/ai/AI-Aimbot 欢迎来到AI视觉瞄准系统的完整实战教程…...

2026 AI低代码实测:原理拆解+主流形态,避坑指南

2026年,AI低代码早已不是“概念炒作”,而是企业数字化转型的核心工具。Gartner预测,2026年全球70%以上新应用将采用低代码/无代码构建,较2023年45%的渗透率实现跨越式增长;IDC数据显示,同期全球AI低代码市场…...

性能优化与profiling技术 - 打造极致性能

引言 性能优化是C语言编程的终极目标之一。作为最接近硬件的高级语言,C语言提供了丰富的优化手段。但盲目优化往往适得其反,科学的性能分析才是优化的前提。 本文将深入讲解性能分析方法、常见优化技巧、以及实用的profiling工具,帮助你写出高性能的C程序。 一、性能测量…...

【笔记】旧AI,新人类

AI擅长"旧",人类擅长"新" 关于人机分工的一点思考 不久前,一场颇具戏剧性的"人机对决"在餐饮界引起了不小的波澜。"美膳狮"智能炒菜机器人与湘菜厨师杨孙同台竞技,共同炒制三道菜:XO酱笋…...

2026年传统视频vs数字人效率对比:差距让很多老板震惊

2026年传统视频vs数字人效率对比:差距让很多老板震惊 【导语】 传统视频制作要7天,AI数字人只要3-5分钟?效率差距到底有多大?今天用真实数据说话。01 效率差距有多大?先看一组数据 很多人对AI数字人的效率提升没有概念…...

B站缓存视频转换完全指南:让珍贵内容真正属于你

B站缓存视频转换完全指南:让珍贵内容真正属于你 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经有过这样的经历&#xff1…...

三步法实战指南:用FanControl打造静音高效的Windows风扇控制系统

三步法实战指南:用FanControl打造静音高效的Windows风扇控制系统 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_T…...

实时商业情报不再滞后,Perplexity新闻搜索配置全拆解,从入门到日均处理200+信源

更多请点击: https://codechina.net 第一章:实时商业情报不再滞后,Perplexity新闻搜索配置全拆解,从入门到日均处理200信源 为什么传统RSS与Google Alerts已失效 现代商业情报对时效性、语义准确性与信源可信度提出更高要求。Pe…...

Purple Pi OH开发板适配OpenHarmony 5.0全流程解析与实战

1. 项目概述:从一块开发板到OpenHarmony 5.0的完整旅程最近,我手头的这块触觉智能Purple Pi OH开发板,终于成功跑通了OpenHarmony 5.0 Release版本。这不仅仅是一次简单的系统升级适配,更像是一场从硬件引脚定义、内核驱动、系统服…...

Perplexity症状查询功能突然失效?排查清单来了:从OpenID Connect令牌过期、UMLS MetaMap服务中断到本地缓存污染的6层故障树分析

更多请点击: https://codechina.net 第一章:Perplexity症状查询功能突然失效?排查清单来了:从OpenID Connect令牌过期、UMLS MetaMap服务中断到本地缓存污染的6层故障树分析 当Perplexity的症状查询接口返回 401 Unauthorized 或…...

Perplexity股票数据清洗SOP(含NASDAQ非标字段映射表):金融工程师内部使用的12项校验规则

更多请点击: https://codechina.net 第一章:Perplexity股票信息检索 Perplexity AI 公司尚未上市,因此不存在公开交易的股票代码、实时行情或交易所挂牌信息。这一事实常被开发者和投资者误读,尤其在使用金融数据 API 时容易触发…...

Perplexity+知网联合检索的7类失效场景全图谱:从DOI解析失败到CSSCI标识丢失的终极修复手册

更多请点击: https://intelliparadigm.com 第一章:Perplexity知网联合检索的失效机理总论 当用户尝试将 Perplexity AI 的实时网络推理能力与知网(CNKI)学术资源库进行协同调用时,系统级耦合在协议层、语义层与权限层…...

苹果Siri 2025全面升级:从LLM集成到系统级智能体的技术路径解析

1. 项目概述:一次迟来的“大脑”升级最近,关于苹果Siri将在2025年迎来全面优化的消息,在圈内引发了不小的讨论。作为一名长期关注智能交互领域发展的从业者,我对此并不感到意外,反而觉得这是一次“虽迟但到”的必要手术…...

Vivado FPGA设计:基于IP核的系统级集成与高效开发实践

1. 引言:从“造轮子”到“搭积木”的设计范式转变如果你在数字电路设计领域摸爬滚打超过五年,大概率经历过从ISE到Vivado的迁移阵痛。2012年,当Xilinx推出Vivado时,很多习惯了ISE“代码驱动”工作流的老工程师都感到不适应——这个…...

3步掌握TEdit地图编辑器:泰拉瑞亚终极创作工具完全指南

3步掌握TEdit地图编辑器:泰拉瑞亚终极创作工具完全指南 【免费下载链接】Terraria-Map-Editor TEdit - Terraria Map Editor - TEdit is a stand alone, open source map editor for Terraria. It lets you edit maps just like (almost) paint! It also lets you c…...

检索增强生成RAG基础架构与手动模拟

检索增强生成RAG基础 什么是RAG? 检索增强生成(RAG)是指对大型语言模型输出进行优化,使其能够在生成响应之前引用训练数据来源之外的权威知识库。大型语言模型(LLM)用海量数据进行训练,使用数十亿个参数为回答问题、翻译语言和完成句子等任务生成原始输…...

Ubuntu 16.04 32位系统下RT-Thread开发环境搭建全攻略

1. 项目概述:为何要重温一个“过时”的旧系统环境?如果你在2024年看到这个标题,第一反应可能是:“Ubuntu 16.04?还是32位?这都什么年代的配置了,现在不都用Ubuntu 22.04或者24.04了吗&#xff1…...

TypeScript-------------类型收窄

//类型收窄 //typeof 类型收窄 function uppercase(content:string|number) {if(typeof content string)//收窄的类型有限{return content.toUpperCase();}return content; }//真值收窄 function getString(content?:string)//加?表示参数可传可不传 {if(typeof …...