2010-03-08 62 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主要用作這是無緩衝而不能有任何情況下,現在,當一個程序崩潰時丟失了一個重大錯誤,只是因爲它是在緩衝區中。