logcat原始碼分析(六)

2021-09-30 09:17:46 字數 1761 閱讀 2256

繼續看

logcat.cpp

的processbuffe

r函式,如果執行完

android_log_shouldprintline

函式後,表明當前日誌記錄應當輸出,則呼叫

android_log_printlogline

函式來輸出日誌記錄到檔案fd中, 這個函式也是定義在

system/core/liblog/logprint.c

檔案中:

intandroid_log_printlogline(  

androidlogformat *p_format,  

int fd,  

const androidlogentry *entry)    

while (ret < 0 && errno == eintr);  

if (ret < 0)  

if (((size_t)ret) < totallen)  

done:  

if (outbuffer != defaultbuffer)  

return ret;  

}  這個函式的作用就是把

androidlogentry

格式的日誌記錄按照指定的格式

androidlogformat

進行輸出了,這裡,不再進一步分析這個函式。

在processbuffer函式

中,最後還有乙個

rotatelogs

的操作:

static

void

rotatelogs()  

close(g_outfd);  

for (int i = g_maxrotatedlogs ; i > 0 ; i--) else  

err = rename (file0, file1);  

if (err < 0 && errno != enoent)  

free(file1);  

free(file0);  

}  g_outfd = openlogfile (g_outputfilename);  

if (g_outfd < 0)  

g_outbytecount = 0;  

}  這個函式只有在執行

logcat

命令時,指定了

-f 引數時,即

g_outputfilename

不為null時才起作用。它的作用是在將日誌記錄迴圈輸出到一組檔案中。例如,

指定-f引數為logfile,g_maxrotatedlogs為3,則這組檔案分別為:

logfile,logfile.1,logfile.2,logfile.3

當當前輸入到logfile檔案的日誌記錄大小

g_outbytecount

大於等於

g_logrotatesizekbytes

時,就要將logfile.2的內容移至logfile.3中,同時將logfile.1的內容移至logfile.2中,同時logfle的內容移至logfile.1中,再重新開啟logfile檔案進入後續輸入。這樣做的作用是不至於使得日誌檔案變得越來越來大,以至於占用過多的磁碟空間,而是只在磁碟上儲存一定量的最新的日誌記錄。這樣,舊的日誌記錄就會可能被新的日誌記錄所覆蓋。預設的

g_logrotatesizekbytes

為16k

,可以通過

logcat的r

引數指定大小。

對logcat原始碼的分析到此結束了!

uC OS II原始碼分析(六)

c os 總是執行進入就緒態任務中優先順序最高的那乙個。確定哪個任務優先順序最高,下面該哪個任務執行了的工作是由排程器 scheduler 完成的。任務級的排程是由函式 ossched 完成的。中斷級的排程是由另乙個函式osintext 完成的,這個函式將在以後描 述。ossched 的 如下 vo...

uC OS II原始碼分析(六)

c os 總是執行進入就緒態任務中優先順序最高的那乙個。確定哪個任務優先順序最高,下面該哪個任務執行了的工作是由排程器 scheduler 完成的。任務級的排程是由函式 ossched 完成的。中斷級的排程是由另乙個函式osintext 完成的,這個函式將在以後描 述。ossched 的 如下 vo...

uC OS II原始碼分析(六)

c os 總是執行進入就緒態任務中優先順序最高的那乙個。確定哪個任務優先順序最高,下面該哪個任務執行了的工作是由排程器 scheduler 完成的。任務級的排程是由函式 ossched 完成的。中斷級的排程是由另乙個函式osintext 完成的,這個函式將在以後描 述。ossched 的 如下 vo...