Linux-关于C语言stderr文件
我知道Linux 的思想是“一切皆文件”,对stdin,和stdout文件的存在表示可以接受,但是为什么要单独提出一个stderr,这个东西也是把信息反映到显示器上啊,和stdout没什么区别吧?我们都可以通过fpritnf();将错误信息输出,那为什么还要提出这么个概念呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这个很简单
因为效率关系 文件流都采用缓存形式 就是当buf到达一定程度 或者触发某个事件 一次写入到终端 文件也是如此
而stderr 是不允许缓存策略的 所以 在出现错误 我们可以第一时间看到错误 就是这个原因 才有了 stderr
我不扯专业发面的给你说,因为楼上已经说的够详细了,我提供给你另外一种思维方式:信息的交流分两种,一种叫做输入(in),一种叫做输出(out),可是我们还要考虑一点,正常(normal)和出错(error)的两种情况,如果这样想到话就会出现四种情况:normal in,normal out,error in,error out。但是error in和error out这两种情况处理可以整合在一起考虑,所以最后就有了三种stdin,stdout,stderr。
默认情况下stderr也是输出到显示器上,但是重定向之后就不是了。通过重定向,就可以把正常的输出(到stdout)和错误信息(到stderr)分开,这就可以分开处理。例如可以把stdout重定向到一个文件,屏幕上就只剩stderr里的错误信息。同理可以把stderr重定向,无视掉错误信息。
这在连接管道的时候很有用,例如下面的命令,计算当前目录下*.c文件的个数:
find . -name "*.c" | wc -l
刚好这里有个目录我们没有权限访问,所以find的输出这样的错误信息:
find: ./spec: Permission denied
find把错误信息输出到stderr,而正常的输出就被重定向到wc的stdin,所以wc不会计算错误信息所占的行数。
总的来说,只有在通过管道和其他程序通信时,stderr 的意义才明显。
1). "stderr,这个东西也是把信息反映到显示器上啊" -- 用户可以把stderr重定向, 比如某个文件. 这样stderr和stdout可以分开处理.
http://www.jstorimer.com/blogs/workingwithcode/7766119-when-to-use-stderr-instead-of-stdout
2). unix实现中, stderr默认不会被缓存, 保证它会被尽快的显示出来; stdout如果连终端, 默认line buffer, 否则全buffer.