2010-03-08 66 views
10

任何人都可以解释阀门和堵塞之间的区别以及为什么会提出不同的对象?关于阀门和堵塞的问题

我知道的差异如下:

1)COUT可以重定向但CERR不能

2)堵塞可以使用缓冲液。

我对第2点感到困惑,我很感谢有人能详细阐述它。

+17

谁说cerr不能重定向?我一直这样做! – 2010-03-08 19:52:52

回答

3

缓冲输出通常比未缓冲的要快得多。所以,如果你想快速写入大量的数据到日志(但不关心它是否真的结束了),你会使用clog而不是cerr。

假设一个模糊的操作系统,所有的流都可以正常重定向,但这与C++标准不同,它没有“重定向”这样的概念。

+3

您可能需要详细阐述cerr/non-buffered-IO的优势 - 即写入操作后即使出现错误,也会写入流。 – 2010-03-08 20:03:48

+0

@RaphaelSP这就是我的意思“(但不在乎它实际上是否在那里结束)” – 2010-03-08 20:06:10

+1

@尼尔:OP似乎对缓冲是什么感到困惑,我认为这个表述可能更清晰:) – 2010-03-08 20:10:42

2

两者都可以被重定向。
在大多数实现中,cerr不会被缓冲,不确定这是否是官方的POSIX要求,但是拥有缓冲的错误流是疯狂的。

分离流的原因来自unix哲学,即一个程序的输出是输入到下一个程序的输入。如果“ls”直接进行“排序”,则在控制台上显示错误更容易,而不必编写排序以了解输入是错误消息还是要分类的文本的一部分。

16

输出可以被缓冲或无缓冲。通过缓冲输出,实现节省了所有输出,直到将其写入磁盘(或任何地方)方便。这很好,很有效,但如果程序崩溃,某些输出很可能会丢失。实现必须在磁盘发生时将无缓冲的输出写入磁盘,这可能会导致大量磁盘写入操作减慢速度,但除非在写入时程序崩溃,否则将写入磁盘。

标准输出和标准错误之间没有真正的功能差异;他们只是两个不同的输出流,可以单独重定向。将工具链接在一起的Unix哲学是标准输出将具有适当的输出以进入下一个工具的输入,并且这非常需要用于错误消息的单独流。所以,cout写入标准输出,并被缓冲。将此用于正常输出。 cerr写入标准错误流,并且无缓冲。使用这个错误消息。 clog写入标准错误流,但被缓冲。这对于执行日志很有用,因为它不会干扰标准输出,但是效率很高(如果程序崩溃,代码可能会丢失日志的结尾)。

1
cout-Screen output(stdout) 
clog-Buffered output of standard error(stderr) 
cerr-Standard error device output (stderr) 
0

使用缓冲和无缓冲输出的主要原因之一可以通过以程序崩溃为例来观察。

考虑将某些内容输出到日志文件中的程序。突然间程序崩溃了。您可能会对此感兴趣,因为知道错误会导致崩溃,但如果您对所有日志和错误使用了clog(缓冲),则可能看不到所有这些信息,因为当程序崩溃时,这些信息可能仍处于缓冲区,因此信息缓冲区也丢失了。

因此,在错误的情况下,cerr主要用作这是无缓冲而不能有任何情况下,现在,当一个程序崩溃时丢失了一个重大错误,只是因为它是在缓冲区中。