【基础IO】-5-简单理解三个标准流——stdin、stdout、stderr

三个标准流

在这篇文章中,我们将从以下三个方面讲述:

  1. 为什么需要三个标准流
  2. 为什么默认打开的一定是三个标准流
  3. 怎么实现:打开这三个标准流

1、为什么需要

程序的核心作用是处理获取进来的数据。那么程序就必须有办法获取数据 ,以及有办法让我们观察数据处理的过程,即能够打印数据。

所以我们就需要有:

  • stdin:标准输入流。以后用户输入的数据,都将从标准输入流出发,流向程序
  • stdout:标准输出流。以后程序处理数据的结果,若没有特别指定流,默认向标准输出流中流出,最终到达显示设备

现在程序能够获取数据、打印数据。在编写代码,执行代码的时候,我们还希望当程序运行发生错误的时候,有办法将错误的具体信息提炼出来让我们知道,以便后续的调试代码,即能够Debug。

所以我们也需要有stderr标准错误流。如果程序运行发生了错误,具体的错误信息就会写入标准错误流,最终让我们能够获取,从而帮助我们修复代码的错误。

2、为什么一定是"三个"

三个标准流连接的设备,一般是:

  • stdin ···> 键盘
  • stdout ···> 显示器
  • stderr ···> 也是显示器

既然标准输出流和标准错误流连接的设备都是显示器,那么我们为什么要同时打开stdin stdout stderr三个标准流呢?为什么不只打开stdin stdout?

原因很好理解:我们希望程序的打印信息和错误信息能够分开来,即分离正常和错误。信息糅杂在一起,还需要做一步分离提取的工作;而将打印结果与错误信息分开来,对着错误信息在打印结果找猫腻,能够更快找到Bug,从而提高调试的效率。

3、怎么做到的

机器开机的时候,做的其中一个重要的工作就是将操作系统加载到内存。

而在操作系统加载的过程中,一定有bash父进程被创建,然后加载磁盘文件、显示器文件到内存。

接着连续创建三个struct file对象与磁盘、显示器建立联系,最后在bash进程files_struct的fd_array中,下标0 1 2处分别放入:

  • 标准输入文件流
  • 标准输出文件流
  • 标准错误文件流






这样bash就打开了三个标准流。

bash之后创建的子进程,进行的是对bash父进程的写时拷贝,包括拷贝fd_array。而写时拷贝,fd_array倒是拷贝下来了,但是其中保存的file*指针还是与bash父进程一样的。







可以理解为stdin stdout stderr三个文件file*指针被传递下去了 。所以子进程一旦被创建,默认打开了stdin stdout stderr三个标准流。(就像环境变量和命令行参数一样)

4、修改标准输出流与标准错误流的操作示范




c 复制代码
#include <stdio.h>

int main()
{
    fprintf(stdout, "Hello stdout\n");
    fprintf(stderr, "Hello stderr\n");

    return 0;
}



bash 复制代码
./test.exe 1>loga.txt 2>logb.txt






相关推荐
牛马鸡niumasi1 小时前
【Linux】进程退出
linux
水饺编程2 小时前
第2章:Linux 基础,mkdir 命令的简单入门
linux·c语言·汇编
自变量yjs2 小时前
Linux --- 线程控制
linux·运维·服务器
陌上花开缓缓归以3 小时前
linux 内核4.4 内存分配使用分析
linux·运维·服务器
欢乐的小猪3 小时前
Linux命令 chmod
linux·运维·服务器
Happy_Sharing4 小时前
Windows虚拟机安装ubuntu后,如何在虚拟机Ubuntu系统中访问Windows文件夹
linux·运维·ubuntu
码上有光4 小时前
Linux:信号的认识、信号的产生、信号的保存、信号的处理
android·linux·运维·信号
anew___4 小时前
《从零手写操作系统 (46):设备模型与devtmpfs——硬件资源的文件系统化》
linux·运维·服务器
Escalating_xu4 小时前
【Linux 网络编程】Windows 客户端访问 Linux:用 Winsock 跑通 UDP 回显
linux·网络·windows