初看mysql源代码之mysql.cc
在mysql的源代码目录中,sql目录是mysql源代码中经常变化的目录之一,也是MySQL服务器内核最为核心和重要的目录。
sql目录除了包含mysqld.cc这一MySQL main函数所在文件外,还包括了各类SQL语句的解析/实现。
在sql目录下的main.cc里面就调用了一个mysqld_main(),但是mysql里面好像有一个win_main()和mysqld_main(),
当时我就比较奇怪,刚好一个对应于windows一个对应于linux下的呀。当时想了半天,没搞明白。后来又看了一遍mysqld_main.cc,才有点看明白了。
实际上在windows下和linuxmysql服务器启动的环境和方式是不一样的,但是mysql为了偷懒只搞了一套源代码,这样发布项目的时候是方便了,尼玛windows和linux只要一套源代码就行了,但是读起来错综复杂的,各种条件编译命令眼花缭乱,让你看不清真相。
mysql在windows和linux上启动服务的过程有一部分代码是相似的,这一部分代码就根据是否定义了_WIN32来决定是命名为win_main()还是mysqld_main();如果是命名为win_main()那么我们在后面还要有一个mysqld_main()来调用这个win_main(),而如果是mysqld_main(),那么后面另外一个mysqld_main()就不需要再定义了。
#ifdef _WIN32 // 如果定义了_WIN32,则会编译win_main()
int win_main(int argc, char **argv)
#else
int mysqld_main(int argc, char **argv) // 如果没有定义了_WIN32,则会编译mysqld_main()
{
// 这个是windows上和linux服务器启动时代码相同的部分
// 当然里面也有很多的编译预处理命令
}
#endif #if defined(_WIN32)
int mysqld_main(int argc, char **argv)
{
// 这里是用于windows上的mysqld_main();
}
#endif // _WIN32 这个endif对应于 5021行的if defined(_WIN32)
就是这几个编译命令决定了是走向windows还是linux,下面我们再来看看mysqld_main()是如何调用win_main()的,
如果你在mysqld_main()直接找win_main()那是找不到滴,这里呢在有个函数叫mysql_service(void *p):
#if defined(_WIN32) // 如果定义了_WIN32
int mysql_service(void *p) // 居然是在这儿调用了win_main()
{
if (my_thread_init())
{
flush_error_log_messages();
return 1;
} if (use_opt_args)
win_main(opt_argc, opt_argv); // 对于win_main()的调用
else
win_main(Service.my_argc, Service.my_argv);// 对于win_main()的调用 my_thread_end();
return 0;
}
哈哈,找到了对win_main()的调用,所以可以肯定mysqld_main()里面也调用了mysql_service(void *p):
找找看,果真有
if (Service.GetOS()) /* true NT family */ // 也就是说这个是用于NT上的
{
char file_path[FN_REFLEN];
my_path(file_path, argv[0], ""); /* Find name in path */
fn_format(file_path,argv[0],file_path,"",
MY_REPLACE_DIR | MY_UNPACK_FILENAME | MY_RESOLVE_SYMLINKS); if (argc == 2)
{
if (!default_service_handling(argv, MYSQL_SERVICENAME, MYSQL_SERVICENAME,
file_path, "", NULL))
return 0;
if (Service.IsService(argv[1])) /* Start an optional service */
{
/*
Only add the service name to the groups read from the config file
if it's not "MySQL". (The default service name should be 'mysqld'
but we started a bad tradition by calling it MySQL from the start
and we are now stuck with it.
*/
if (my_strcasecmp(system_charset_info, argv[1],"mysql"))
load_default_groups[load_default_groups_sz-2]= argv[1];
windows_service= true;
Service.Init(argv[1], mysql_service); // 这个里面调用了mysql_service,也就是说会间接的调用到win_main()
return 0;
}
}
else if (argc == 3) /* install or remove any optional service */
{
if (!default_service_handling(argv, argv[2], argv[2], file_path, "",
NULL))
return 0;
if (Service.IsService(argv[2]))
{
/*
mysqld was started as
mysqld --defaults-file=my_path\my.ini service-name
*/
use_opt_args=1;
opt_argc= 2; // Skip service-name
opt_argv=argv;
windows_service= true;
if (my_strcasecmp(system_charset_info, argv[2],"mysql"))
load_default_groups[load_default_groups_sz-2]= argv[2];
Service.Init(argv[2], mysql_service);
// 这个里面调用了mysql_service,也就是说会间接的调用到win_main()
return 0;
}
}
else if (argc == 4 || argc == 5)
{
/*
This may seem strange, because we handle --local-service while
preserving 4.1's behavior of allowing any one other argument that is
passed to the service on startup. (The assumption is that this is
--defaults-file=file, but that was not enforced in 4.1, so we don't
enforce it here.)
*/
const char *extra_opt= NullS;
const char *account_name = NullS;
int index;
for (index = 3; index < argc; index++)
{
if (!strcmp(argv[index], "--local-service"))
account_name= "NT AUTHORITY\\LocalService";
else
extra_opt= argv[index];
} if (argc == 4 || account_name)
if (!default_service_handling(argv, argv[2], argv[2], file_path,
extra_opt, account_name))
return 0;
}
else if (argc == 1 && Service.IsService(MYSQL_SERVICENAME))
{
/* start the default service */
windows_service= true;
Service.Init(MYSQL_SERVICENAME, mysql_service);
// 这个里面调用了mysql_service,也就是说会间接的调用到win_main()
return 0;
}
}
就看了这一点先写这么多?
初看mysql源代码之mysql.cc的更多相关文章
- Win7+VS2010:mysql 源代码编译与调试
win7+vs2010源代码编译mysql 近期因为在实习,工作重点在于一些数据库的开发,为了更好的理解数据库的实现机制.眼下萌生了要研究一下mysql数据库源代码的想法.那么好吧,说干就干.首先我们 ...
- 源代码安装 MySQL 5.6.28
本文内容 创建 MySQL 用户和组 解压 MySQL 源代码包 生成配置安装文件 编译和安装 MySQL 配置文件 创建 MySQL 授权表 MySQL 目录授权 启动 MySQL 验证 MySQL ...
- MySQL 源代码scr.rpm安装的一点注意事项
rpm安装包通常为二进制包(Binary)以及源代码包(Source)两种形式. 在使用源代码方式安装MySQL的时候,官方站点上下载的源代码包通常为scr.rpm格式,而不是直接的tar包.对此,须 ...
- 分析学习MYSQL源代码需要哪些方面的知识呢?
分析学习MYSQL源代码需要哪些方面的知识呢? 哪些书籍或网站对这方面有帮助呢? 60d
- MYSQL源代码编译的变动
Mysql的安装,对于mysql不同版本号的mysql源代码编译方式不一样 5.6.2的版本号開始编译方式已经由 configure 变成了cmake方式 ,相关的新的 编译方式在mysql官网已经提 ...
- Macos 编译运行调试Mysql源代码
准备编译工具Clion 下载地址 工具是macos用的系统 百度云盘下载地址(密码: 7dus) 下载mysql源码 Mysql源码下载地址 下载boost boost下载地址 前期准备工作 MySQ ...
- 一看就懂的MySQL的FreeList机制
Hi,大家好!我是白日梦! 今天我要跟你分享的MySQL话题是:"了解InnoDB的FreeList吗?谈谈看!" 本文是MySQL专题的第 7 篇,共110篇. 一.回顾 前面几 ...
- linux下 yum源、rpm、源代码安装mysql
mysql的安装 一.yum源格式安装mysql 1.将下载的yum包上传到linux上: [root@localhost ~]# ls mysql-community-release-el6-5.n ...
- SQL学习笔记——SQL初入门,Ubuntu下MySQL的安装
刚开始接触sql,于是准备在Ubuntu下学习sql,就跟着itercast的sql教程开始入门了. 下面只是我个人的记录,高手请绕道: 一. 在安装之前,我们可以用下面这个命令通过开放端 ...
随机推荐
- maven 发布到仓库
到nexus中看到的仓库地址 <distributionManagement> <repository> <id>releases</id> <n ...
- leetcode621 贪心:任务安排
题目链接 给定26种任务,每种任务的数量已知. 相同任务之间必须间隔n个时间段,为了不足n个时间段,可以让及其休息. 问:最少需要多长时间才能处理完这些任务? 这道题用贪心策略解决:每次安排任务时,优 ...
- ajax操作登录
js文件中的内容(ajax.operate.js) ;(function ($, window) { var _ajaxOperate = window.ajaxOperate || {}; _aja ...
- 下载url地址的图片
// string url = "https://api.weixin.qq.com/cgi-bin/media/get?access_token=cNaaMfvhpb1vmcVRXRAdI ...
- OAF_OAF Framework学习笔记的基本概念(概念)
2014-11-02 Created By BaoXinjian
- Linux中断 - IRQ number和中断描述符
一.前言 本文主要围绕IRQ number和中断描述符(interrupt descriptor)这两个概念描述通用中断处理过程.第二章主要描述基本概念,包括什么是IRQ number,什么是中断描述 ...
- iOS接收null的处理方法
常常server返回的数据,有null,还有nil,假设在模型层不处理的话,到时候数据展现时,一定会崩啊,近期决心要解决问题,所以查看了一些资料后,有答案了: - (id) setNoNull:(id ...
- SQL批量删除用户表(先删除所有外键约束,再删除所有表)
--批量删除用户表 --1.删除外键约束DECLARE c1 cursor for select 'alter table ['+ object_name(parent_obj) + '] d ...
- C#--类成员
数据成员: 字段: 常量: 函数成员(执行代码): 方法: 属性 构造函数 析构函数 运算符 索引 事件 可以被声明为Static的类成员是:
- python标准库介绍——23 UserString 模块详解
==UserString 模块== (2.0 新增) ``UserString`` 模块包含两个类, //UserString// 和 //MutableString// . 前者是对标准字符串类型的 ...