0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

請(qǐng)問(wèn)stdout和stderr有哪些區(qū)別呢?

學(xué)益得智能硬件 ? 來(lái)源:學(xué)益得智能硬件 ? 2024-01-13 16:15 ? 次閱讀

為什么大佬在寫(xiě)代碼的時(shí)候,對(duì)于一些錯(cuò)誤的提示信息喜歡用stderr,而不是直接用printf輸出?

這里面是不是有什么講究?

c8da7938-b1ea-11ee-8b88-92fbcf53809c.png ?

Linux里面,用于處理輸入和輸出的文件描述符有三個(gè),分別表示標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出,和標(biāo)準(zhǔn)錯(cuò)誤處理。

比如我們常用的 scanf 和 printf,一個(gè)從標(biāo)準(zhǔn)輸入獲取數(shù)據(jù),一個(gè)往標(biāo)準(zhǔn)輸出寫(xiě)入數(shù)據(jù)。

stdout和stderr都是輸出,這兩個(gè)的區(qū)別主要有三點(diǎn)。

首先,stdout有緩沖,stderr沒(méi)有緩沖。

#include 
#include 


int main()
{
    const char *s = "no such file...";


    while (1) 
    {   
        fprintf(stderr, "error : %s", s); 
        sleep(1);
    }   


    return 0;
}
比如這個(gè)代碼,使用stderr,會(huì)直接把字符串顯示到屏幕上,用戶能立馬看見(jiàn)。

c8ed00b2-b1ea-11ee-8b88-92fbcf53809c.png ?

但是如果換成stdout,用戶什么也看不見(jiàn)。

因?yàn)榇a中沒(méi)加換行符,程序也沒(méi)有正常結(jié)束。 平時(shí)我們用的printf,就是往stdout里面寫(xiě)數(shù)據(jù)。

所以使用stderr,它的實(shí)時(shí)性更高,有問(wèn)題,立馬看見(jiàn)。

第二點(diǎn)也跟緩沖有關(guān)系。如果使用stdout,當(dāng)程序發(fā)生錯(cuò)誤奔潰的時(shí)候,緩沖區(qū)里面的重要數(shù)據(jù)也會(huì)被清空,看不到日志,問(wèn)題也不好解決。

第三點(diǎn),使用stdout和stderr也可以把不同的數(shù)據(jù)分開(kāi),防止放在一起混亂。
#include 


int main()
{
    fprintf(stderr, "錯(cuò)誤信息
");


    printf("正常輸出信息
");


    return 0;
}
這一點(diǎn)在重定向的時(shí)候就能體現(xiàn)出來(lái),默認(rèn)只會(huì)把標(biāo)準(zhǔn)輸出的數(shù)據(jù)定向到目標(biāo)文件中。

c908ca04-b1ea-11ee-8b88-92fbcf53809c.png ??







審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11475

    瀏覽量

    212999
  • Printf
    +關(guān)注

    關(guān)注

    0

    文章

    84

    瀏覽量

    14147

原文標(biāo)題:stdout和stderr有哪些區(qū)別

文章出處:【微信號(hào):學(xué)益得智能硬件,微信公眾號(hào):學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 0人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    請(qǐng)問(wèn)PWM波輸出方式中的邊沿對(duì)齊與中心對(duì)齊什么區(qū)別?

    請(qǐng)問(wèn)PWM波輸出方式中的邊沿對(duì)齊與中心對(duì)齊什么區(qū)別?對(duì)于PMSM FOC應(yīng)該使用那種對(duì)齊方式?為什么
    發(fā)表于 02-05 06:06

    (文件描述符0、1、2),(stdin、stdout、stderr),(終端設(shè)...

    標(biāo)準(zhǔn)輸入文件stdin,標(biāo)準(zhǔn)輸出文件stdout和標(biāo)準(zhǔn)錯(cuò)誤輸出文件stderr分別得到的。那么文件描述符0、1和2到底是打開(kāi)哪個(gè)文件得到的?這里該如何解釋???望懂得其中緣由者指點(diǎn)
    發(fā)表于 03-02 22:05

    mini2440串口測(cè)試程序中stdoutstderr不懂,求大俠講解下。。。

    主要是這兩段程序不懂,那個(gè)stdoutstderr不懂。。void OutputStdChar(FILE *File) {//向設(shè)備寫(xiě)數(shù)據(jù),打開(kāi)一個(gè)串口,聲明并且定義該函數(shù) char Buffer
    發(fā)表于 10-25 12:45

    請(qǐng)問(wèn)固件和程序什么區(qū)別?

    本帖最后由 一只耳朵怪 于 2018-5-25 16:13 編輯 請(qǐng)問(wèn)固件和程序什么區(qū)別?固件是那種燒錄進(jìn)去的不可逆轉(zhuǎn)的硬件編程么?為什么好多可重復(fù)燒寫(xiě)的代碼叫做XXX固件?
    發(fā)表于 05-25 16:00

    請(qǐng)問(wèn)一下printf格式符%ld %lld %d區(qū)別

    請(qǐng)問(wèn)一下printf格式符%ld %lld %d區(qū)別?
    發(fā)表于 12-02 07:18

    如何看到這些通過(guò)printf/fprintf輸出到stdout/stderr的打印信息

    當(dāng)我們使用 procd init 腳本讓某個(gè)應(yīng)用程序?qū)崿F(xiàn)開(kāi)機(jī)自啟時(shí),會(huì)發(fā)現(xiàn)應(yīng)用程序中原本通過(guò) printf/fprintf 等輸出到 stdout/stderr 的打印信息都無(wú)法從串口或 adb
    發(fā)表于 12-29 07:45

    全志D1-H芯片 Tina 如何查看通過(guò) procd init 腳本啟動(dòng)的應(yīng)用輸出到 stdout/stderr 的打印信息?

    問(wèn)題描述當(dāng)我們使用 procd init 腳本讓某個(gè)應(yīng)用程序?qū)崿F(xiàn)開(kāi)機(jī)自啟時(shí),會(huì)發(fā)現(xiàn)應(yīng)用程序中原本通過(guò) printf/fprintf 等輸出到 stdout/stderr 的打印信息都無(wú)法從串口或
    發(fā)表于 03-16 13:54

    全志D1-H芯片 Tina 如何查看通過(guò) procd init 腳本啟動(dòng)的應(yīng)用輸出到 stdout/stderr 的打印信息?

    問(wèn)題描述當(dāng)我們使用 procd init 腳本讓某個(gè)應(yīng)用程序?qū)崿F(xiàn)開(kāi)機(jī)自啟時(shí),會(huì)發(fā)現(xiàn)應(yīng)用程序中原本通過(guò) printf/fprintf 等輸出到 stdout/stderr 的打印信息都無(wú)法從串口或
    發(fā)表于 03-29 19:13

    “移動(dòng)PC”和筆記本電腦什么區(qū)別

    “移動(dòng)PC”和筆記本電腦什么區(qū)別?    問(wèn):我想買(mǎi)一臺(tái)低價(jià)筆記本電腦,怕買(mǎi)到“移動(dòng)PC”,請(qǐng)問(wèn)
    發(fā)表于 01-23 11:27 ?2808次閱讀

    FPGA和單片機(jī)什么區(qū)別

    到底FPGA和單片機(jī)什么區(qū)別?根據(jù)我的經(jīng)驗(yàn),可以用下面進(jìn)行概述。
    發(fā)表于 02-11 08:00 ?4.3w次閱讀

    type-c和普通接口什么區(qū)別?

      隨著type-c接口的普及,現(xiàn)在越來(lái)越多的電子產(chǎn)品都使用了type-c接口,那么,type-c和普通接口什么區(qū)別?
    的頭像 發(fā)表于 07-28 11:17 ?7064次閱讀
    type-c和普通接口<b class='flag-5'>有</b>什么<b class='flag-5'>區(qū)別</b><b class='flag-5'>呢</b>?

    請(qǐng)問(wèn)放大器與中繼器什么區(qū)別?

    請(qǐng)問(wèn)放大器與中繼器什么區(qū)別? 放大器和中繼器是網(wǎng)絡(luò)設(shè)備中常見(jiàn)的兩種裝置,它們?cè)诰W(wǎng)絡(luò)中起到了不同的作用。盡管這兩個(gè)設(shè)備都可以增強(qiáng)信號(hào),但它們有著不同的功能和使用場(chǎng)合。在本文中,我們將詳細(xì)討論放大器
    的頭像 發(fā)表于 09-13 14:17 ?2908次閱讀

    什么叫做LVDS信號(hào)?請(qǐng)問(wèn)TTL信號(hào)與LVDS信號(hào)什么區(qū)別?

    什么叫做LVDS信號(hào)?請(qǐng)問(wèn)TTL信號(hào)與LVDS信號(hào)什么區(qū)別? LVDS信號(hào) LVDS(Low Voltage Differential Signaling)又稱低壓差分信號(hào)傳輸技術(shù),是一種采用差分
    的頭像 發(fā)表于 10-18 15:38 ?3344次閱讀

    天線和饋線哪些區(qū)別?

    天線和饋線哪些區(qū)別? 天線和饋線是無(wú)線通信系統(tǒng)中不可或缺的兩個(gè)部分,它們?cè)趯?shí)現(xiàn)無(wú)線信號(hào)的傳輸和接收過(guò)程中起著關(guān)鍵的作用。雖然天線和饋線都是用于無(wú)線通信的,但它們的功能和應(yīng)用場(chǎng)景有所不同。以下將
    的頭像 發(fā)表于 01-04 15:05 ?3147次閱讀

    請(qǐng)問(wèn)Docker和傳統(tǒng)虛擬機(jī)什么區(qū)別?

    雖然人跑了,但起碼還有服務(wù)器陪著他,但屏幕前依然單身的你? 你連服務(wù)器都沒(méi)有。
    的頭像 發(fā)表于 03-29 15:54 ?695次閱讀
    <b class='flag-5'>請(qǐng)問(wèn)</b>Docker和傳統(tǒng)虛擬機(jī)<b class='flag-5'>有</b>什么<b class='flag-5'>區(qū)別</b><b class='flag-5'>呢</b>?

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品