繼續看
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...