詳解C語言中的stdin,stdout,stderr
我們在寫C程式時經常遇到printf(),fprintf(),perror(),這些東西到底有什麼作用。說到這不得不提及stdin,stdout,stderr。想想,我們在用C去寫檔案時的操作,File
*fp=fopen(),這個fp就是我們向系統申請的,相當於一通往檔案的通道。
其實,stdin,stdout,stderr就是這個fp,不過他是隨著計算機系統的開啟預設開啟的,其中0就是stdin,表示輸入流,指從鍵盤輸入,1代表stdout,2代表stderr,1,2預設是顯示器。printf()其實就是向stdout中輸出,等同於fprintf(stdout,“****”),perror()其實就是向stderr中輸出,相當於fprintf(stderr,“***”),那到底stdout,和stderr有什麼區別和作用呢?
我們在寫程式時用printf()是為了我們能監控我們的程式執行狀況,或者是說debug,如果我們的程式是一直執行,不停下來,我們不可能時刻盯著螢幕去看程式輸出,這時我們就可以用檔案重定向。將輸出到一檔案中,我們以後就可以看這檔案就行。舉個例子,test.c
[cpp] view plain copy
1. <pre class="cpp" name="code">#include<stdio.h>
2.
3. int main()
4. {
5. printf("stdout Helo World!!\n");
6.
7. return 0;
8. }
編譯過後,我們./test > test.txt(預設是將stdout裡的內容重定向到檔案中),這樣就把test程式輸出的內容輸出到test.txt檔案中。還有一種更明晰的寫法./test 1>test.txt,這裡的1就代表stdout。說到這你應該知道stderr該怎樣處理了。再舉個例子test.c:
[cpp] view plain copy
1. #include<stdio.h>
2.
3. int main()
4. {
5. printf("Stdout Helo World!!\n");
6. fprintf(stdout,"Stdout Hello World!!\n");
7. perror("Stderr Hello World!!\n");
8. fprintf(stderr,"Stderr Hello World!!\n");
9.
10. return 0;
11. }
編譯過後,./test,螢幕上是四條輸出,如果./test > test.ext ,結果是螢幕上輸出兩條Stderr Hello World!!,Stdout Helo World!!在檔案test.txt中,基於上面說的很容易理解現在的結果,於是我們可以隨便處理我們想要的輸出,例如:
./test 1>testout.txt 2>testerr.txt,我們將stdout輸出到檔案testout.txt中,將stderr輸出到testerr.txt檔案中;
./test 1>testout.txt ,將stdout輸出到檔案testout.txt 中,stderr輸出到螢幕上;
./test 2>testerr.txt,將stderr輸出到檔案testerr.txt中,stdout輸出到螢幕上;
./test > test.txt 2>&1,這是將stdout和stderr重定向到同一檔案test.txt檔案中。
如果我們不想看到輸出內容,既不想在螢幕上看見,也不想重定向到檔案中,別擔心,萬能的Linux有解決辦法,./test > /dev/zero 2>&1,這樣就看不到任何輸出了。
Note:stderr,和stdout還有重要一點區別,stderr是沒有緩衝的,它立即輸出,而stdout預設是行緩衝,也就是它遇到‘\n’,才向外輸出內容,如果你想stdout也實時輸出內容,那就在輸出語句後加上fflush(stdout),這樣就能達到實時輸出的效果。
轉載於微信公眾號 嵌入式ARM