Linux中的stdout和stderr
2016-02-03 17:03
567 查看
1,在linux中,标准输出和标准错误默认都是将信息输出到终端上,那么他们有什么区别呢?让我们来看个题目:
问题:下面程序的输出是什么?(intel笔试2011)
答案是: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
答案在这里;
看到了吧,将标准输出重定向到到磁盘文件stdout.file,与将标准错误重定向到磁盘文件stderr.file,其结果是正好相反的。
问题:下面程序的输出是什么?(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,其结果是正好相反的。
相关文章推荐
- linux下常用的解压/压缩命令
- Linux dd 命令
- Linux C获取PCI设备名和厂商名
- Linux 目标地址转换实验
- Linux atexit函数解析
- Linux 使用wget 命令下载JDK的方法
- Linux每日学习(十五)
- centos6.5下安装qq2012
- linux命令
- select、poll、epoll之间的区别总结[整理]
- Linux curl命令参数详解--转载
- Linux命令:rm
- linux下zip文件解压后乱码解决方案
- linux系统上安装paramiko模块
- Linux常用指令---ssh/scp
- Using TurboVNC 0.6 and VirtualGL 2.1.4 to run OpenGL Application Remotely on CentOS
- Linux流量监控工具 - iftop (最全面的iftop教程)
- linux 命令
- linux查看磁盘空间命令
- linux ./configure 的参数详解