Linux中的stdout和stderr

本文详细阐述了Linux环境中标准输出(stdout)与标准错误(stderr)的区别,以及它们在遇到重定向时的行为差异。通过具体实例解释了stdout的行缓冲特性与stderr的直接输出方式,并提供了gcc编译后的程序执行结果对比,帮助理解两者在实际应用中的不同用途。
摘要由CSDN通过智能技术生成

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

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

#include <stdio.h>

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

    return 0;
}

答案是:World!Hello

这是为什么呢?在默认情况下,stdout是行缓冲的,它的输出会先放在一个buffer里面,只有到换行的时候,才会输出到屏幕;而stderr是无缓冲的,会直接输出。

举例来说就是fprintf(stdout, “xxxx”) 和 fprintf(stdout, “xxxx\n”),前者在返回时并不刷新buffer,直到遇到新行或函数返回时才会刷新缓冲区并输出;而fprintf(stderr, “xxxxx”),不管有没有’\n’,都直接输出。

现在再来看这道题:
首先,程序执行第一条打印语句时,由于stdout是行缓冲,而这里没有换行符,所以函数返回,要打印的内容还留在缓冲区里;
然后,执行第二条打印语句,由于stderr是无缓冲,World!直接打印在终端上;
最后,函数执行返回语句return,缓冲区中的Hello 此时被冲洗,在终端打印出来。

所以,整个程序的运行结果就是:World!Hello

2,当stdout、stderr遇到重定向,会发生什么?

问题:下面的程序gcc编译之后分别执行下面两个命令,结果分别是什么?
./a.out 1>stdout.file
./a.out 2>stderr.file

#include <stdio.h>

int main()
{
    printf("a\n");

    fprintf(stdout,"b\n");

    fprintf(stderr, "c\n");

    return 0;
}

答案在这里;
这里写图片描述

看到了吧,将标准输出重定向到到磁盘文件stdout.file,与将标准错误重定向到磁盘文件stderr.file,其结果是正好相反的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值