设置系统的RLIMIT_CORE当前值和最大值都为无限大
然后设置系统RLIMIT_NOFILE(系统内每个进程能打开的文件数)为全局结构体settings.maxconns
j接着是如果用户位root,则必须使用参数-u root,否则会打印输出,然后退出
取得登录用户的信息,根据此信息来设置组id和用户id
如果系统支持sasl则初始化
如果系统是在deamon情况下运行,则对SIGHUP信号的处理是忽略,调用daemon(调用fork生成子进程,父进程退出,然后设置子进程为进程组首进程,切换到根目录,把输入出处,错误输出都指向/dev/null)
如果设定了参数-k,则调用mlockall将当前进程所使用的所有的内存空间锁在物理内存中,防止被操作系统交换到swap分区(操作系统把一些不活跃的进程转移到swap分区,(就是使用硬盘来作为虚拟内存);
调用libevent库函数event_init()来初始化事件
调用stats_init初始化全局结构体stats(在memcached客户端使用此命令可以输出此结构体的很多成员变量的值)
assoc_init 初始化primary_hashtable(从堆内分配65536个void*指针)
设置SIGPIPE信号的处理方法是忽略(写到管道时候,读进程已经终止,管道是子进程父进程直接通讯的ipc)
初始化线程(memcached采用多线程的方法处理客户连接,如果采用多进程,并且封装epoll的不适用libevent库,因为如果仅仅编一个软件使用一个库,浪费很大)根据settings.num_threads数目来创建线程数)第二个参数是struct event_base指针
调用clock_handler处理一下evtimer的事情
根据settings. socketpath创建管道,
保存当前进程id并保存为文件
然后一个event_base_loop(调用event_init的返回值,中间被线程初始化也掉用过一次)等待事件被触发,然后调用事件 的处理函数,此函数会一直运行,知道没有可以添加的函数,或者直到调用了event_base_loopbreak()或者evenet_base_loopexit()