為什么大佬在寫代碼的時候,對于一些錯誤的提示信息喜歡用stderr,而不是直接用printf輸出?
這里面是不是有什么講究? ?
在Linux里面,用于處理輸入和輸出的文件描述符有三個,分別表示標準輸入,標準輸出,和標準錯誤處理。
比如我們常用的 scanf 和 printf,一個從標準輸入獲取數據,一個往標準輸出寫入數據。
stdout和stderr都是輸出,這兩個的區別主要有三點。
首先,stdout有緩沖,stderr沒有緩沖。
#include比如這個代碼,使用stderr,會直接把字符串顯示到屏幕上,用戶能立馬看見。#include int main() { const char *s = "no such file..."; while (1) { fprintf(stderr, "error : %s", s); sleep(1); } return 0; }
![c8ed00b2-b1ea-11ee-8b88-92fbcf53809c.png](https://file1.elecfans.com/web2/M00/BD/5B/wKgaomWiRxOADi9GAADqh9-atgk944.png)
但是如果換成stdout,用戶什么也看不見。
因為代碼中沒加換行符,程序也沒有正常結束。 平時我們用的printf,就是往stdout里面寫數據。
所以使用stderr,它的實時性更高,有問題,立馬看見。
第二點也跟緩沖有關系。如果使用stdout,當程序發生錯誤奔潰的時候,緩沖區里面的重要數據也會被清空,看不到日志,問題也不好解決。
第三點,使用stdout和stderr也可以把不同的數據分開,防止放在一起混亂。
#include這一點在重定向的時候就能體現出來,默認只會把標準輸出的數據定向到目標文件中。int main() { fprintf(stderr, "錯誤信息 "); printf("正常輸出信息 "); return 0; }
![c908ca04-b1ea-11ee-8b88-92fbcf53809c.png](https://file1.elecfans.com/web2/M00/BD/5B/wKgaomWiRxOAcYJVAADOjCYccX8448.png)
審核編輯:劉清
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
Linux
+關注
關注
87文章
11351瀏覽量
210504 -
Printf
+關注
關注
0文章
83瀏覽量
13744
原文標題:stdout和stderr有哪些區別
文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
(文件描述符0、1、2),(stdin、stdout、stderr),(終端設...
標準輸入文件stdin,標準輸出文件stdout和標準錯誤輸出文件stderr分別得到的。那么文件描述符0、1和2到底是打開哪個文件得到的呢?這里該如何解釋呢???望懂得其中緣由者指點
發表于 03-02 22:05
mini2440串口測試程序中stdout和stderr不懂,求大俠講解下。。。
主要是這兩段程序不懂,那個stdout和stderr不懂。。void OutputStdChar(FILE *File) {//向設備寫數據,打開一個串口,聲明并且定義該函數 char Buffer
發表于 10-25 12:45
請問固件和程序有什么區別呢?
本帖最后由 一只耳朵怪 于 2018-5-25 16:13 編輯
請問固件和程序有什么區別呢?固件是那種燒錄進去的不可逆轉的硬件編程么?為什么好多可重復燒寫的代碼叫做XXX固件?
發表于 05-25 16:00
如何看到這些通過printf/fprintf輸出到stdout/stderr的打印信息呢
當我們使用 procd init 腳本讓某個應用程序實現開機自啟時,會發現應用程序中原本通過 printf/fprintf 等輸出到 stdout/stderr 的打印信息都無法從串口或 adb
發表于 12-29 07:45
全志D1-H芯片 Tina 如何查看通過 procd init 腳本啟動的應用輸出到 stdout/stderr 的打印信息?
問題描述當我們使用 procd init 腳本讓某個應用程序實現開機自啟時,會發現應用程序中原本通過 printf/fprintf 等輸出到 stdout/stderr 的打印信息都無法從串口或
發表于 03-16 13:54
全志D1-H芯片 Tina 如何查看通過 procd init 腳本啟動的應用輸出到 stdout/stderr 的打印信息?
問題描述當我們使用 procd init 腳本讓某個應用程序實現開機自啟時,會發現應用程序中原本通過 printf/fprintf 等輸出到 stdout/stderr 的打印信息都無法從串口或
發表于 03-29 19:13
請問放大器與中繼器有什么區別?
請問放大器與中繼器有什么區別? 放大器和中繼器是網絡設備中常見的兩種裝置,它們在網絡中起到了不同的作用。盡管這兩個設備都可以增強信號,但它們有著不同的功能和使用場合。在本文中,我們將詳細討論放大器
什么叫做LVDS信號?請問TTL信號與LVDS信號有什么區別?
什么叫做LVDS信號?請問TTL信號與LVDS信號有什么區別? LVDS信號 LVDS(Low Voltage Differential Signaling)又稱低壓差分信號傳輸技術,是一種采用差分
天線和饋線有哪些區別呢?
天線和饋線有哪些區別呢? 天線和饋線是無線通信系統中不可或缺的兩個部分,它們在實現無線信號的傳輸和接收過程中起著關鍵的作用。雖然天線和饋線都是用于無線通信的,但它們的功能和應用場景有所不同。以下將
評論