• 【Linux基础】linux下的stdin,stdout和stderr理解


    在Linux下,当一个用户进程被创建的时候,系统会自动为该进程创建三个数据流,也就是题目中所提到的这三个。

    1.三个数据流默认是表现在用户终端上的

    执行一个shell命令行时通常会自动打开三个标准文件:

    • 标准输入文件(stdin),通常对应终端的键盘;
    • 标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应终端的屏幕。

    进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。

    如下例所示,cat命令的功能是从命令行给出的文件中读取数据,并将这些数据直接送到标准输出。

    //cat命令行含参数:把文件config的内容依次显示到屏幕上
    [root@localhost ~]# cat config
    //cat命令行没有参数:会从标准输入中读取数据,并将其送到标准输出。
    #用户输入的每一行都立刻被cat命令输出到屏幕上,直到按Ctrl+d结束【标准输入接收到EOF(结束)标识符】
    [root@localhost ~]# cat
    Hello world
    Hello world
    Bye
    Bye
    终端输入输出存在问题:
    输入数据从终端输入时,输入的数据只能用一次,且输入有误修改起来不是很方便。
    输出到终端屏幕上的信息只能看不能动。无法对此输出作更多处理。
    为了解决上述问题,Linux系统为输入、输出的传送引入了另外两种机制,即输入/输出重定向和管道。

    2.三个数据流可以重定向到文件中

    (1)输入重定向

    输入重定向是指把命令(或可执行程序)的标准输入重定向到指定的文件中。也就是说,输入可以不来自键盘,而来自一个指定的文件。

    使用“ < ”符号将标准输入重定向到文件中

    如下例所示,wc将返回该文件所包含的行数、单词数和字符数。

    //把wc命令的输入重定向为/etc/passwd文件
    [root@localhost ~]# wc < /etc/passwd 24 30 1061

    (2)输出重定向

    输出重定向是指把命令(或可执行程序)的标准输出或标准错误输出重新定向到指定文件中。这样,该命令的输出就不显示在屏幕上,而是写入到指定文件中。

    使用 “ > ”符号,将标准输出重定向到文件中。形式为:命令>文件名

    使用“ >> ”符号,将标准输出结果追加到指定文件后面。形式为:命令>>文件名

     使用“ 2> ”符号,将标准错误输出重定向到文件中。形式为:命令 2> 文件名

    使用“ 2>> ”符号,将标准错误输出追加到指定文件后面。形式为:命令 2>>文件名

    使用“ 2>&1 ”符号或“ &> ”符号,将把标准错误输出stderr重定向到标准输出stdout

    使用“ >/dev/null ”符号,将命令执行结果重定向到空设备中,也就是不显示任何信息。

    [root@localhost ~]# ls > directory.out
    [root@localhost ~]# ls *.doc>>directory.out
    [root@localhost ~]# ls /usr/tmp 2> err.file  //可在屏幕上看到程序的正常输出结果,但又将程序的任何错误信息送到文件err.file中,以备将来检查用
    [root@localhost ~]# ls /usr/tmp &> output.file  
    [root@localhost ~]# ls /usr/tmp 2>&1 output.file
    [root@localhost ~]# ls >/dev/null  

    (3)几个基本符号及其含义

    • /dev/null 表示空设备文件
    • 0 表示stdin标准输入
    • 1 表示stdout标准输出
    • 2 表示stderr标准错误

    stdin,stdout和stderr还是和终端有密切关系,通常在生产环境时,会将这3个流重定向到其它文件。比如编写守护进程的时候,因为守护进程和终端无关,所以往往会将stdin,stdout和stderr重定向到/dev/null去。

     3.stdout和stderr区别

    我们知道,标准输出和标准错误默认都是将信息输出到终端上,那么他们有什么区别呢?让我们来看个题目:

    问题:下面程序的输出是什么?(intel笔试2011)

    int main(){
    fprintf(stdout,"Hello ");
    fprintf(stderr,"World!");
    return0;
    }

    解答:这段代码的输出是什么呢?你可以快速的将代码敲入你电脑上(当然,拷贝更快),然后发现输出是

    World!Hello

    原理:在默认情况下,stdout是行缓冲的,他的输出会放在一个buffer里面,只有到换行的时候,才会输出到屏幕。

    而stderr是无缓冲的,会直接输出,举例来说就是printf(stdout, "xxxx") 和 printf(stdout, "xxxx "),前者会憋住,直到遇到新行才会一起输出。而printf(stderr, "xxxxx"),不管有么有 ,都输出。

    参考文档:

    重定向stdin stdout stderr 

    linux 中 >跟 >> 区别 ,2>&1 是什么 

     linux中stdout,stdin,stderr意义

  • 相关阅读:
    Python自动化之面向对象进阶
    Python自动化之pickle和面向对象初级篇
    Python自动化之常用模块
    剑指offer 顺时针打印矩阵
    剑指 offer 树的子结构
    剑指offer 合并两个排序的链表
    剑指offer 调整数组顺序使奇数位于偶数前面
    剑指offer 数值的整数次方
    变态跳台阶
    剑指offer 重建二叉树
  • 原文地址:https://www.cnblogs.com/badboy200800/p/11121880.html
Copyright © 2020-2023  润新知