Linux和Windows下使用printf的差別

2021-10-05 09:30:50 字數 1210 閱讀 6073

【1.linux系統下】

一般而言,大家都知道printf是帶有行緩衝的函式,printf把列印的訊息先輸出到行緩衝區,在以下幾種情況下:1.程式結束時呼叫exit(0)/return;2.遇到回車\n,3.呼叫fflush函式;4.緩衝區滿。會自動重新整理緩衝區,緩衝區的內容顯示到標準輸出上。

比如在linux系統下,執行如下程式:

#include

int main(void)

使用gcc編譯後執行,發現shell中並沒有輸出hello,這是因為linux系統下,printf把「hello」輸出到緩衝區,而此時沒有發生緩衝區重新整理的4種情況,因此shell中並不會看到hello。但是如果使用printf("hello\n");或者在printf後使用fflush(stdout);那麼執行時在shell中就會看到hello輸出。

【2.windows系統下】

同樣這段程式,如果在windows下編譯執行(使用vc++6.0),會發現控制台中馬上看到hello的輸出。分析原因發現,windows下stdout沒有提供緩衝(不知道這個原因是否確切)。比如執行如下程式:

#include

int main(void)

可以看到stdout的緩衝區大小為0,這也就意味著,stdout是沒有緩衝區的,因此printf輸出到stdout,不存在緩衝,這個和linux系統中對printf處理的機制是不一樣的。

在windows下,可以使用setbuf函式(

來設定緩衝區的方式和大小。

#include

char buf[512]

;int main(void)

使用setbuf函式,把stdout設定為行緩衝,大小為512位元組。在vc++6.0中執行該程式,發現不會在控制台中輸出hello,如果把緩衝區設定為2個位元組大小:setvbuf(stdout, buf, _iolbf, 2);此時程式的輸出為hell,he輸出到緩衝區,緩衝區滿,重新整理緩衝區,控制台看到he,ll輸出到緩衝區,緩衝區滿,再次重新整理,控制台看到ll,o輸出到緩衝區,此時緩衝區未滿,因此看不到o在控制台輸出。

使用如下程式,檢視緩衝區的大小,輸出結果為512位元組

#include

char buf[512]

;int main(void)

此外,在windows設定緩衝區的情況下,printf中使用回車符\n是不會重新整理緩衝區的。對上述程式,把fflush函式注釋掉,在vc++6.0中重新執行,控制台中看不到輸出。

Windows和Linux下socket的區別

1.標頭檔案 windows下winsock.h或winsock2.h linux下netinet in.h 大部分都在這兒 unistd.h close函式在這兒 sys socket.h 在in.h裡已經包含了,可以省了 2.初始化 windows下需要用wsastartup啟動ws2 32.l...

windows和linux下socket程式設計的不同

windows windows 標頭檔案的區別 include include windows 初始化的區別 windows 宣告socket socket型別 windows socket關閉 closesocket windows socket操作錯誤返回值 socket error windo...

Windows下安裝OpenSSL及其使用

1.perl 安裝後重啟系統。2latest openssl 並解壓到 c openssl 0.9.8k。參考openssl 目錄下的 install.win32 說明進行安裝 1 進入解壓目錄。cd c openssl 0.9.8k 2 執行configure。perl configure vc ...