色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

printf數據都去哪兒了

流川楓楓 ? 來源:流川楓楓 ? 作者:流川楓楓 ? 2022-05-23 14:08 ? 次閱讀

關于printf

printf是一個接口,跟UNIX標準IO的write系統調用類似,但是更像C庫的fwrite,因為同系列的函數中還有一個fprintf(至于同系列其它的函數,請自行man)。printf和fwrite的區別在于兩點:

1.它可以格式化輸出,如果用fwrite,它接受的是一個固定的buffer,你不得不在調fwrite之前先使用sprintf之類的函數格式化buffer;

2.它免除了你的fopen-fwrite-fclose這個序列的調用,因為它直接將格式化的內容寫入UNIX進程自然打開的1號文件描述符,即標準輸出。

既然printf寫入了標準輸出,那么接下來就要定義什么是標準輸出。在早期UNIX年代,人們在終端或者偽終端操作機器,那時的輸入基本都是鍵盤,磁帶更古老的東西,而輸出就是一個計算結果,需要展示出來給人看的那種,一般為終端屏幕,也可以是一條紙帶,那么程序怎么知道輸入和輸出到底是什么呢?這就需要程序明確指定。UNIX的“一切皆文件”思想以及“分離抽象”思想徹底改變了這一切。

UNIX定義了抽象文件描述符0,1,2分別為標準輸入,標準輸出,標準錯誤輸出。至于它們到底對應什么設備,你可以在程序初始化的時候顯式重定向到任意設備,也可以在外部shell做類似的重定向,這樣就把指明設備這件事從程序分離了出來。

我為什么不統一說一下fwrite調用對程序性能的影響呢?因為該調用之前你必須執行fopen,而fopen的一個參數明確表示了你希望寫入的對象是什么,這就不會帶來異議,畢竟如果你非要在性能測試的時候寫CF卡,那也是你愿意。printf就不同了,它對效率的影響取決于標準輸出是什么以及你是如何重定向標準輸出的,所謂的標準輸出并不是真實的設備,它只是一個抽象層,具體如何解釋標準輸出,還要依靠外部。

數據都去哪兒了

我以下面這個超級小的程序來說明printf的時候,數據都去哪了:
#include
#include
int main(int argc, char **argv)
{ int i = 0;
int c = atoi(argv[1]);
for(; i < c; i++) { ??????????????
printf("############ %d\n", i);
} return 0;
}

我先給出結果:
1.在/dev/tty1上直接執行time ./test 1000
... ######### 995
######### 996
######### 997
######### 998
######### 999
real 0m0.414s
user 0m0.003s
sys 0m0.411s

2.在/dev/tty1上執行time ./test 1000 >/dev/tty2
real 0m0.007s
user 0m0.003s
sys 0m0.007s
3.在SecureCRT上執行time ./test 1000
...
######### 997
######### 998
######### 999
real 0m0.010s
user 0m0.002s
sys 0m0.003s

在SecureCRT上執行time ./test 100000 >/dev/tty1,此時不切換tty
...
等了幾秒,無結果,于是在鍵盤按下Alt-F2,切換到第二個tty,馬上顯示出了結果:
real 0m4.276s
user 0m0.066s
sys 0m4.204s
5.在tty1上執行time ./test 100000 >/dev/tty2:
real 0m0.499s
user 0m0.081s
sys 0m0.410s
6.在tty1上執行time ./test 100000 >/dev/null
real 0m0.030s
user 0m0.028s
sys 0m0.001s

通過以上的結果數據,我們可以得到以下的結論:
a.對于tty終端而言,如果當前終端不是寫入的終端,那么開銷主要在內核態,且開銷不是很大;
b.對于tty終端而言,如果當前終端是寫入的終端,那么開銷主要在內核態,且開銷很大;
c.對于不管是tty還是遠程的pty終端,寫入/dev/null的開銷主要在用戶態,開銷不大;
d.對于pty遠程終端(/dev/pts/X),不管寫入的是不是當前的pty終端,開銷主要在內核態,且開銷不是很大
e.對應上面的結果和結論,下面給出一幅圖解,詳細解釋一下printf冰山下面的秘密:

test進程

線路規程串口舉例:

線路規程串口舉例

簡易圖如下:

簡易圖

我想上圖已經很清楚了,如果不懂什么叫行規程(也叫線路規程)的話,請閱讀《UNIX環境高級編程》的終端和偽終端章節,簡單來說,它就是一個中間層,用來適配VFS接口和底層的具體驅動,比如解釋和處理控制字符等。從上面的圖中,我們可以看出,主要的開銷幾乎都集中在底層,而底層卻偏偏是我們不能控制或者很難控制的。之所以上面的測試例子中ssh登錄的終端對test性能的測試效果良好,但是那是因為網絡環境好,你在一個64kbps相隔5k公里的線路上試一下。

小小的printf下面竟然藏著如此多的內容,并且很可能就是它成了你的程序的性能瓶頸,因為最底層的影響因素往往是不可控的。那么是不是就是意味著我要建議大家從來不用printf打印呢?或者說干脆就不要用標準輸出呢?并不是這樣。但是為何不把打印這種事交給本機的另一個進程呢?事實上,幾乎所有的需要記錄日志的系統都是這么做的,而syslog則迎合了這個思想。這種思想的背后就是“用可控制的一次IPC替換不可控制冰山之下的茫茫深海

關于日志記錄

日志記錄一直都是“薛定諤貓”式的東西,因為日志記錄作為一段代碼,它已經是程序的一部分,不可能獨立地觀察程序的行為,如果說用鏡像系統的話,那么這種行為就是被動的,你不得不鏡像每一條指令,以發現一些關鍵的信息,要想主動記錄關鍵事件,必須用日志系統。打印日志可以方便信息獲取和審計,但是代價有時也是高昂的:
1.你要設計一套日志回滾系統,防止存儲空間被撐爆;
2.你要讓日志記錄盡快完成,不能降低關鍵路徑的性能;
3.你要反復調試代碼,確保日志記錄的緩沖區不會溢出;
4.為了讓日志更短,語言能力不好的人組織的日志就像電報一樣難以理解。
...
我認為,日志記錄應該遵循以下的原則:

1.除非必須要把事件發生的時間記錄下來,否則就用計數器代替日志記錄,一系列的事件映射成一系列的計數器,由用戶決定什么時候查看事件發生了。事實上,Linux的網絡子系統就是用的這種方式,所有的/proc/net/netstat就是這個查看接口。

2.一定要有一個日志級別控制選項,用戶可以決定是否記錄日志,以及記錄的日志詳細到什么程度。

tty層接口

驅動代碼摘自:

lichee/linux-3.10/drivers/tty/serial/sunxi-uart.c

接收數據

static unsigned int sw_uart_handle_rx(struct sw_uart_port *sw_uport, unsigned int lsr)

{

….

tty_flip_buffer_push(&sw_uport->port.state->port);

}

tty_termios_baud_rate(termios)

tty_termios_encode_baud_rate(termios, baud, baud);

發送數據

發送數據
審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8577

    瀏覽量

    151023
  • 數據
    +關注

    關注

    8

    文章

    7004

    瀏覽量

    88944
  • Printf
    +關注

    關注

    0

    文章

    83

    瀏覽量

    13650
收藏 人收藏

    評論

    相關推薦

    高手都去哪兒

    本人學習單片機數月,目前發現學習過程中的一個問題,用的教材是郭天祥老師的那本新概念。在這里就是想問問高手們,我是先按照書上歷程做完還是朝著一個歷程使勁的拓展,直到完全掌握在看下一個歷程?
    發表于 03-12 14:29

    飛凌嵌入式干貨分享 - printf的歸宿-數據打印到哪兒

    標準輸出是什么以及你是如何重定向標準輸出的,所謂的標準輸出并不是真實的設備,它只是一個抽象層,具體如何解釋標準輸出,還要依靠外部。數據都去哪兒我以下面這個超級小的程序來說明
    發表于 03-06 16:40

    淘汰的新能源汽車電池都去哪兒

    一輛指導價為30萬的新能源汽車,其電池成本可能在10萬元甚至以上。“一般來說,動力電池的容量低于80%就不能再用在新能源汽車上。”上海交大汽車工程研究院副院長殷承良此前在接受記者采訪時表示。
    發表于 11-24 15:07 ?694次閱讀

    SDK中大寫的PRINTF和小寫printf的區別

     講一下SDK中大寫的PRINTF和小寫printf的區別。
    發表于 09-15 17:47 ?2次下載
    SDK中大寫的<b class='flag-5'>PRINTF</b>和小寫<b class='flag-5'>printf</b>的區別

    printf輸出格式

    printf函數稱為格式輸出函數,其關鍵字最末一個字母f即為“格式”(format)之意。其功能是按用戶指定的格式,把指定的數據顯示到顯示器屏幕上。printf函數調用的一般形式printf
    發表于 11-10 08:52 ?3.4w次閱讀

    stm32串口通信用printf發送數據配置

    在STM32串口通信程序中使用printf發送數據,非常的方便。可在剛開始使用的時候總是遇到問題,常見的是硬件訪真時無法進入main主函數,其實只要簡單的配置一下就可以。下面就說一下使用pr
    發表于 11-25 09:08 ?4399次閱讀

    基于STM32的printf串口數據輸出

    該方法適用于 STM32 ,實現使用printf等標準C流函數輸出數據的辦法,極大的減少了輸出 串口數據 時所需要做的數據處理。 實現原理
    發表于 06-21 07:51 ?2w次閱讀
    基于STM32的<b class='flag-5'>printf</b>串口<b class='flag-5'>數據</b>輸出

    程序員和開發者的時間都去

    對于那些不知道程序員/開發者的時間都去的人,本文可能會提供一些線索。我記錄了這份日志不僅是為了看看時間都花費在哪,也是為了看看我都做了些什么,檢視下自己是否偷懶。當回顧之后,我
    的頭像 發表于 11-22 16:29 ?1444次閱讀

    工業機器人需求自3月以來持續復蘇,機器人都去哪兒

    ;服務機器人產量也實現單月70%以上的同比增速。 這些新生機器人都去哪兒?作為智能制造領域先進生產力的代表,機器人產業高速增長受哪些板塊驅動,對中國制造業意味著什么? 機器人
    的頭像 發表于 11-13 10:54 ?1883次閱讀

    STM32中使用printf打印串口數據的實現原理及方法

    STM32中使用printf打印串口數據的實現原理 在C庫中,printf()等輸出流函數都是通過fputc()這個函數實現的,所以我們通過重映射的方式,修改這個函數的定義使它輸出在STM32
    的頭像 發表于 07-22 11:12 ?1.5w次閱讀

    stm32 printf重定向

    stm32調試時,有時不太適合打斷點的地方,還需要狀態,那printf就很符合我們的要求。不多說,直接上修改方法:首先:添加printf的頭文件 :#include “stdio.h”其次
    發表于 12-03 14:36 ?3次下載
    stm32 <b class='flag-5'>printf</b>重定向

    Keil下使用STlink重定向printf的配置

    Keil下使用STlink重定向printf的配置1. printf 重定向Keil默認下使用Micro LIB庫,該庫調用 fputs 實現 printf,所以需要重新定義fputs函數,以重定向
    發表于 12-27 18:43 ?18次下載
    Keil下使用STlink重定向<b class='flag-5'>printf</b>的配置

    stm32單片機串口使用printf及u3_printf

    無論是在51單片機還是在stm32,默認printf串口都是串口一。使用printf的時候頭文件為&amp;quot;stdio.h&amp;quot;,但是一些
    發表于 12-27 19:24 ?1次下載
    stm32單片機串口使用<b class='flag-5'>printf</b>及u3_<b class='flag-5'>printf</b>

    通過串口利用printf函數輸出數據

    一。printf函數格式printf函數具有強大的輸出功能%表示格式化字符串輸出目前printf支持以下格式的輸出,例如:printf("%c",a);輸出單個字符。
    發表于 12-28 19:11 ?11次下載
    通過串口利用<b class='flag-5'>printf</b>函數輸出<b class='flag-5'>數據</b>

    stdio.h實現printf函數?

    我們平時包含的 stdio.h 頭文件,里面是不是實現 printf 函數? 為什么會有這個疑問?因為每次使用 printf,就得包含 stdio.h ,這就導致很多同學誤以為,stdio.h
    的頭像 發表于 12-18 10:28 ?87次閱讀
    主站蜘蛛池模板: GAY空少被体育生开菊| 蜜桃成熟时2在线| 偷窥美女3| brazzers情欲狂欢| 免费A级毛片无码鲁大师| 在公交车上被JB草坏了被轮J了 | 性欧美videosex18嫩| 大睾丸内射老师| 欧美性猛交AAA片免费观看| 2019午夜福利757视频第12集| 九九热精品免费观看| 亚洲另类中文字幕| 国产在线精品一区二区在线看| 无码国产色欲XXXX视频| 国产AV综合手机在线观看| 日韩人妻少妇一区二区三区| 边做边爱免费视频播放| 欧美日韩亚洲第一区在线| ai换脸在线全集观看| 欧美疯狂做受xxxxx喷水| 99久久精品久久久| 欧美乱妇狂野欧美在线视频| 99精品视频在线观看免费播放| 男人到天堂a线牛叉在线| 99精品视频在线观看免费播放| 美女内射少妇一区二区四区| 7777色鬼xxxx欧美色夫| 美女乱草鲍高清照片| 99精彩免费观看| 欧美亚洲日韩欧洲不卡| 边做边爱播放3免费观看| 日本色呦呦| 国产成人精品电影在线观看| 我年轻漂亮的继坶2中字在线播放| 国产成人午夜精品免费视频 | 乱码AV午夜噜噜噜噜| 24小时日本在线观看片免费| 男男校园园bl文全肉高h寝室| h片下载地址| 日韩精品一区VR观看| 国产精品伦理一二三区伦理|