日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux和Windows下使用printf的差别

發(fā)布時(shí)間:2024/1/23 linux 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux和Windows下使用printf的差别 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【1.Linux系統(tǒng)下】

一般而言,大家都知道printf是帶有行緩沖的函數(shù),printf把打印的消息先輸出到行緩沖區(qū),在以下幾種情況下:1.程序結(jié)束時(shí)調(diào)用exit(0)/return;2.遇到回車\n,3.調(diào)用fflush函數(shù);4.緩沖區(qū)滿。會自動(dòng)刷新緩沖區(qū),緩沖區(qū)的內(nèi)容顯示到標(biāo)準(zhǔn)輸出上。

比如在LINUX系統(tǒng)下,執(zhí)行如下程序:

#include <stdio.h> int main(void) {printf("hello");while(1);return 0; }

使用GCC編譯后執(zhí)行,發(fā)現(xiàn)shell中并沒有輸出hello,這是因?yàn)長INUX系統(tǒng)下,printf把“hello”輸出到緩沖區(qū),而此時(shí)沒有發(fā)生緩沖區(qū)刷新的4種情況,因此shell中并不會看到hello。但是如果使用printf("hello\n");或者在printf后使用fflush(stdout);那么執(zhí)行時(shí)在shell中就會看到hello輸出。

【2.WINDOWS系統(tǒng)下】
同樣這段程序,如果在Windows下編譯運(yùn)行(使用VC++6.0),會發(fā)現(xiàn)控制臺中馬上看到hello的輸出。分析原因發(fā)現(xiàn),Windows下stdout沒有提供緩沖(不知道這個(gè)原因是否確切)。比如執(zhí)行如下程序:
?

  • #include?<stdio.h>
  • int?main(void)
  • {
  • ????printf("hello\n");
  • ????printf("buf size is %d\n",stdout->_bufsiz);
  • ????while(1);
  • ????return 0;
  • }
  • 可以看到stdout的緩沖區(qū)大小為0,這也就意味著,stdout是沒有緩沖區(qū)的,因此printf輸出到stdout,不存在緩沖,這個(gè)和LINUX系統(tǒng)中對printf處理的機(jī)制是不一樣的。

    在Windows下,可以使用setbuf函數(shù)(https://msdn.microsoft.com/en-us/library/86cebhfs.aspx)來設(shè)置緩沖區(qū)的方式和大小。
    ?

  • #include?<stdio.h>
  • char buf[512];
  • int?main(void)
  • {
  • ????setvbuf(stdout,?buf,?_IOLBF,?512);
  • ????printf("hello");????
  • ????while(1);
  • ????return 0;
  • }
  • 使用setbuf函數(shù),把stdout設(shè)置為行緩沖,大小為512字節(jié)。在VC++6.0中運(yùn)行該程序,發(fā)現(xiàn)不會在控制臺中輸出hello,如果把緩沖區(qū)設(shè)置為2個(gè)字節(jié)大小:setvbuf(stdout, buf, _IOLBF, 2);此時(shí)程序的輸出為hell,he輸出到緩沖區(qū),緩沖區(qū)滿,刷新緩沖區(qū),控制臺看到he,ll輸出到緩沖區(qū),緩沖區(qū)滿,再次刷新,控制臺看到ll,o輸出到緩沖區(qū),此時(shí)緩沖區(qū)未滿,因此看不到o在控制臺輸出。

    使用如下程序,查看緩沖區(qū)的大小,輸出結(jié)果為512字節(jié)

  • #include?<stdio.h>
  • char buf[512];
  • int?main(void)
  • {
  • ????setvbuf(stdout,?buf,?_IOLBF,?512);
  • ????printf("hello\n");
  • ????printf("%d\n",stdout->_bufsiz);
  • ????fflush(stdout);
  • ????while(1);
  • ????return 0;
  • }

  • 此外,在Windows設(shè)置緩沖區(qū)的情況下,printf中使用回車符\n是不會刷新緩沖區(qū)的。對上述程序,把fflush函數(shù)注釋掉,在VC++6.0中重新執(zhí)行,控制臺中看不到輸出。

    總結(jié)

    以上是生活随笔為你收集整理的Linux和Windows下使用printf的差别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。