swoole的TCP服务器实现-swoole_server创建过程( 三 )


//swoole的全局变量初始化void swoole_init(void){//linux资源限制描述符,后面有用到时再分析struct rlimit rlmt;//如果SwooleG的running已经启动,在跳过,关于SwoolG的定义和初始化就在下面if (SwooleG.running){return;}//全局变量SwooleG的初始化,bzero会将SwooleG的全部地址空间置0,关于SwooleG全局变量,后面再分析,这里只需要知道SwooleG为swoole_server的全局配置变量 。bzero(&SwooleG, sizeof(SwooleG));//全局变量SwoolWG的初始化,这里将SwooleWG的全部地址空间置0,关于SwooleWG全局变量,后面再分析,这里只需要知道SwooleWG为swoole_worker的全局配置值bzero(&SwooleWG, sizeof(SwooleWG));//全局变量sw_error的初始化,这里将sw_error的全部地址空间置0,关于sw_error全局变量,后面再分析bzero(sw_error, SW_ERROR_MSG_SIZE);//标记服务为已启动SwooleG.running = 1;//标记服务协程相关,后面再分析SwooleG.enable_coroutine = 1;//全局变量sw_errno的初始化,这里sw_errno为int16_t类型,直接赋值0做初始化sw_errno = 0;//标记日志文件描述符,这里赋值为标准输出SwooleG.log_fd = STDOUT_FILENO;//标记cpu个数,通过linux的api获取SwooleG.cpu_num = sysconf(_SC_NPROCESSORS_ONLN);//标记内存页的大小,通过linux的api获取SwooleG.pagesize = getpagesize();//记录当前进程号SwooleG.pid = getpid();//记录socket通信的buffer的size大小,这里SW_SOCKET_BUFFER_SIZE定义为(8*1024*1024),也就是8MSwooleG.socket_buffer_size = SW_SOCKET_BUFFER_SIZE;//通过是否是调试模式,设置日志级别#ifdef SW_DEBUGSwooleG.log_level = 0;#elseSwooleG.log_level = SW_LOG_INFO;#endif//初始化获取获取当前内核名称和其它信息uname(&SwooleG.uname);//初始化随机数种子信息srandom(time(NULL));//创建全局的内存池,swMemoryGlobal_new函数后续在分析,这个函数第一个参数SW_GLOBAL_MEMORY_PAGESIZE的值为2M,也就是一次性申请的内存池为2M大小,这里内存池是通过单链表的方式去管理,也就是存在多个2M大小的内存池SwooleG.memory_pool = swMemoryGlobal_new(SW_GLOBAL_MEMORY_PAGESIZE, 1);//内存池申请失败时,退出程序if (SwooleG.memory_pool == NULL){printf("[Master] Fatal Error: global memory allocation failure.");exit(1);}//从已经申请到的内存池里面分配空间,分配空间大小为sizeof(SwooleGS_t),同时做初始化,空间初始化为全局变量SwoolGS,这里的实现后续单独分析SwooleGS = SwooleG.memory_pool->alloc(SwooleG.memory_pool, sizeof(SwooleGS_t));//内存池分配空间失败时,退出程序if (SwooleGS == NULL){printf("[Master] Fatal Error: failed to allocate memory for SwooleGS.");exit(2);}//初始化全局变量SwooleGS的锁1,这里用到的是linux下的互斥锁,后续具体分析swMutex_create(&SwooleGS->lock, 1);//初始化全局变量SwooleGS的锁2,这里用到的是linux下的互斥锁,后续具体分析swMutex_create(&SwooleGS->lock_2, 1);//初始化全局变量SwooleG的锁,这里用到的是linux下的互斥锁,后续具体分析swMutex_create(&SwooleG.lock, 0);//获取系统设置的进程可以打开的文件数信息(通过参数RLIMIT_NOFILE控制),获取的信息写入rlmt中if (getrlimit(RLIMIT_NOFILE, &rlmt) < 0)//获取失败{//打印警告日志信息,这里不会做退出程序处理swWarn("getrlimit() failed. Error: %s[%d]", strerror(errno), errno);//将全局变量SwoolG的max_sockets,即可以打开的文件个数初始化为1024SwooleG.max_sockets = 1024;}else//获取成功{//全局变量SwoolG的max_sockets属性设置为系统进程可以打开的最大文件个数信息SwooleG.max_sockets = (uint32_t) rlmt.rlim_cur;}//全局变量SwoolTG的属性buffer_stack的初始化,这里初始化为8192个字节大小SwooleTG.buffer_stack = swString_new(8192);if (SwooleTG.buffer_stack == NULL)//初始化失败,退出程序{exit(3);}//如果全局变量SwooleG的task_tmpdir属性未设置,则对该属性做初始化if (!SwooleG.task_tmpdir){ //调用封装过的strndup做字符串的拷贝,SW_TASK_TMP_FILE的值为/tmp/swoole.task.XXXXXXSwooleG.task_tmpdir = sw_strndup(SW_TASK_TMP_FILE, sizeof(SW_TASK_TMP_FILE));SwooleG.task_tmpdir_len = sizeof(SW_TASK_TMP_FILE);}//获取task_tmpdir的上级目录,也就是/tmp目录char *tmp_dir = swoole_dirname(SwooleG.task_tmpdir);//递归创建目录if (access(tmp_dir, R_OK)