启动过程安装main函数调用函数来分析
1 sanitycheck 这个是完整性分析,主要是查看libevent版本是不是1.1或者1.2,如果低于1.1 1.2 请升级到1.1 或者最高(调用event_get_version返回一个字符串)(在自己的电脑上面得到的版本是2.0.21-stable 编译的时候要加上-levent这个库名字)
2signal 定义SIGINT 处理办法就是退出,这个是对中断信号的处理方法
3 setbuf调用此函数来关闭出错缓冲setbuf(stderr,NULL);
4 (一个大循环基本可以就结束了)while循环调用getopt 返回值不为-1
getopt 第一第二参数主函数的参数
后面解释一下用户输入参数的选项的意思
-a 后面接的8八进制表示unix socket权限
-p tcp链接服务器的端口
-s unix socket 目录
-U udp端口
-m 最大内存
-M 内存耗尽返回错误 后面无需参数
-c 最大链接
-k锁定所有分页内存 后面无需参数
-hi 帮助信息,以及注册信息(后面无需参数)
-v表示详细信息 无需参数
-d表示deamon模式运行
-l 表示监听借口
-p 保存memcached进程pid文件
-n 最小分配给key+value+flags内存空间大小
-t 线程数目
-L 大内存页(不懂
-R 每个事件最大连接数
-C不适用cas 后面不带参数
-B绑定协议
-S打开sasl (这个需要首先安装libsasl,然后安装gsasl)
-o 扩展选项
(如果在循环内调用while (-1 != (c = getopt(argc, argv, "a:" "p:" "s:")) ){
cout << optarg<< endl;(optarg是全局变量
}
此时主函数的参数是-a 100 -p 999 -s fasdfas
调用的时候输出是
100
999
fasdfas
)
实际上在memcached中将所有的-* 后面的参数赋给全局结构体settings中的某个成员
case a 是调用strtol将optarg转换为8进制的书返回给settings成员access
case U 是调用atoi将optarg转为整数赋给settings成员udpport
case p 调用atoi将optarg转为整数赋给settings成员port(也就是默认的tcp协议端口)
case s 将optarg直接赋给settings成员socketpath
case m 调用atoi将optarg转为整数赋给settings成员maxbytes然后乘以1024*1024 实际上就是限制了最大的内存空间(以兆为单位)
case M 内存耗尽将settings成员evict_to_free赋为0
case c 调用atoi将optarg转为整数赋给赋给settings成员 maxconns
case h 调用usage(),输出用法信息,然后调用exit退出
case i 调用useage_license,然后退出
case k 将main内变量lock_memory设为1
case v 将赋给settings成员verbose 自加1
case l 如果赋给settings成员inter不为空,则将-l后面的参数和inter一起放入inter,如果为空则将-l后面参数赋给inter
case d 使用deamon模式yunxing
case r 将main变量maxconre设为1
case R 将optarg转为整数赋给赋给settings成员reqs_per_event
case u 将optarg赋给username
case p 将optarg赋给pid_file
case f 将optarg转换为浮点数也就是每次相乘的不是2,而是转为浮点数的赋给settings成员factor变量(且不能小于1)
case t 将调用atoi将optarg转为整数赋给赋给settings成员赋给settings成员num_threads也就是多少个线程运行如果线程数大于64或者小于0都不行
case D 如果optarg为空或者第一个字符为空,main函数返回,程序终止,如果不成立则将optarg第一个字符赋给赋给settings成员prefix_delimiter,然后settings.detail_enabled = 1;
case L 如果支持大叶分配则将preallocate赋为true,如果不支持则返回错误信息
case C settings成员use_cas赋为0
case b 调用atoi将optarg转为整数赋给settings成员backlog
case B 如果optarg为auto则将settings成员binding_protocol 赋为negotiating_prot,如果为binary则将settings.binding_protocol = ascii_prot;settings.binding_protocol = binary_prot;如果为ascii则将settings.binding_protocol = ascii_prot;,其他选项都是错误的
case I,optarg最后一个字符如果为k或者K,m,M,则将optarg转为内存大(如果最后为k,K则是多少kB字节,如果为M,m则是多少兆字节),然后赋给settings.item_size_max,
case S如果 本系统支持sasl则将将settings成员sasl赋为true,如果不支持打印输出
case o 调用getsubopt来得到optarg参数下的子参数,比如hashpower_init slab_reassign,slab_autmove等等
循环结束
如果全局结构体settings成员inter不为空,且inter里面有一个,号,则settings.num_threads_per_udp = 1;否则settings.num_threads_per_udp = settings.num_threads;
如果settings成员sasl不为false,如果指定了协议,则将settings绑定的协议
太详细了,换成自己的语言