mysql原始碼閱讀(啟動一)

2021-09-27 01:52:22 字數 3370 閱讀 3779

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...