mysql5.7.27
帶boost的基於linux系統的源**
extern
intmysqld_main
(int argc,
char
**ar**)
;//告訴編譯器,下面是c語言的函式。經常在c++混編的程式中看到
intmain
(int argc,
char
**ar**)
檢視mysqld函式定義:
檔案sql\mysqld.cc
發現有三個位置存在mysqld_main方法,其中中間一行是注釋
win_main in mysqld.cc (d:\vmshare\mysql-5.7.27\sql) : int mysqld_main(int argc, char **ar**)
win_main in mysqld.cc (d:\vmshare\mysql-5.7.27\sql) : // for windows, my_init() is called from the win specific mysqld_main
mysqld.cc (d:\vmshare\mysql-5.7.27\sql) line 5315 : int mysqld_main(int argc, char **ar**)
這個是什麼原因?
繼續分析源**:
5315行的部分,可以看到從5312行至5426行,在這個中間部分的mysqld_main函式是條件編譯的部分
基本結構為:
#if defined(_win32)
中間定義了一部分的函式
intmysqld_main()
....
.//也就是說,如若有定義的 _win32的部分,則會才會編譯這個部分的**。如果不是windows平台,則是使用的這個部分的**
#endif
//_win32
如若有定義的 _win32的部分,則會才會編譯這個部分的**。如果不是windows平台,則是使用的這個部分的**
具體的這一部分**結構如下 :
#if defined(_win32)
intmysql_service
(void
*p)if
(use_opt_args)
win_main
(opt_argc, opt_ar**)
;//編譯的時候,如windows平台,則呼叫win_main的方法
else
win_main
(service.my_argc, service.my_ar**)
;my_thread_end()
;return0;
}/* quote string if it contains space, else copy */
static
char
*add_quoted_string
(char
*to,
const
char
*from,
char
*to_end)
/** handle basic handling of services, like installation and removal.
@param ar** pointer to argument list
@param servicename internal name of service
@param displayname display name of service (in taskbar ?)
@param file_path path to this program
@param startup_option startup option to mysqld
@retval
0 option handled
@retval
1 could not handle option
*/static bool
default_service_handling
(char
**ar**,
const
char
*servicename,
const
char
*displayname,
const
char
*file_path,
const
char
*extra_opt,
const
char
*account_name)
intmysqld_main
(int argc,
char
**ar**)
#endif
// _win32
檢視第乙個搜尋結果的部分
從4420到4432函式開開始
#ifdef _win32
intwin_main
(int argc,
char
**ar**) 如果是windows,則編譯成win_main。
#else
intmysqld_main
(int argc,
char
**ar**) 如果不是windows,則直接編譯成mysqld_main函式
#endif
通過如上分析,我們採用linux除錯的話,其實其源**編譯的過程為:
main.cc(main方法呼叫mysqld_main) > mysqld.cc(第乙個部分4423行左右的mysqld_main) > 執行具體的啟動流程
windows的啟動流程:
main.cc(main方法呼叫mysqld_main) > mysqld.cc(通過_win32定義,呼叫的是5315行左右的mysqld_main方法) > mysqld.cc(5315行左右的mysqld_main方法呼叫mysql_service(null)方法 > mysqld.cc(mysql_service方法又呼叫了win_main方法)> win_main方法,有4420行左右通過_win32的巨集定義可以條件編譯出來 ,從而最終和linux系統的版本進入到乙個{}的方法體內部
原理總結
mysql為了實現可以在win32平台與類uninx平台**共用,將一些公用的函式抽象出來,最終程式進入統一的方法體 {},但是win32和類unix平台啟動方式不一樣。
遺留問題:
條件編譯的這個 _win32巨集是在**定義的?需要進一步學習的。
《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具
檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...
Nacos原始碼一 原始碼啟動
一 nacos 原始碼本地啟動 官方單機啟動文件 將原始碼匯入到idea,然後開啟console專案中的配置檔案 按照nacos文件中單機啟動模式修改mysql配置 資料庫連線串需要有時區 useunicode true characterencoding utf8 servertimezone u...
原始碼閱讀 Glide原始碼閱讀之with方法(一)
前言 本篇基於4.8.0版本 原始碼閱讀 glide原始碼閱讀之with方法 一 原始碼閱讀 glide原始碼閱讀之load方法 二 原始碼閱讀 glide原始碼閱讀之into方法 三 大多數情況下,我們使用glide 就一句 但是這一句 裡面蘊含著成噸的 with方法有以下幾個過載方法 publi...