/*
* 自己写程序最好是参照下面的书写过程
**/
1 //程序主入口函数---------------------------------- 2 int main(int argc, char *const *argv) 3 { 5 //(0)先初始化的变量 6 g_stopEvent = 0; //标记程序是否退出,0不退出 7 8 //(1)无伤大雅也不需要资源释放的代码放最上边 9 ngx_pid = getpid(); //取得进程pid 10 ngx_parent = getppid(); //取得父进程的id 12 …… 13 14 //(2)初始化失败,就要直接退出的,或有些数据需要先拿到的 15 //配置文件必须最先要,后边初始化啥的都用,所以先把配置读出来,供后续使用 16 CConfig *p_config = CConfig::GetInstance(); //单例类 17 if(p_config->Load("nginx.conf") == false) //把配置文件内容载入到内存 18 { 19 ngx_log_init(); //初始化日志 20 ngx_log_stderr(0,"配置文件[%s]载入失败,退出!","nginx.conf"); 21 exitcode = 2; //标记找不到文件 22 goto lblexit; 23 } 24 //(2.1)内存单例类可以在这里初始化,返回值不用保存 25 CMemory::GetInstance(); 26 //(2.2)crc32校验算法单例类可以在这里初始化,返回值不用保存 27 CCRC32::GetInstance(); 28 29 //(3)一些必须事先准备好的资源,先初始化 30 ngx_log_init(); //日志初始化(创建/打开日志文件),这个需要配置项,所以必须放配置文件载入的后边; 31 32 //(4)一些初始化函数,准备放这里 33 if(ngx_init_signals() != 0) //信号初始化 34 { 35 exitcode = 1; 36 goto lblexit; 37 } 38 if(g_socket.Initialize() == false) //初始化socket 39 { 40 exitcode = 1; 41 goto lblexit; 42 } 43 44 //(5)一些不好归类的其他类别的代码,准备放这里 45 ngx_init_setproctitle(); //把环境变量搬家 46 47 //------------------------------------ 48 //(6)创建守护进程 49 if(p_config->GetIntDefault("Daemon",0) == 1) //读配置文件,拿到配置文件中是否按守护进程方式启动的选项 50 { 51 //1:按守护进程方式运行 52 int cdaemonresult = ngx_daemon(); 53 if(cdaemonresult == -1) //fork()失败 54 { 55 exitcode = 1; //标记失败 56 goto lblexit; 57 } 58 if(cdaemonresult == 1) 59 { 60 //这是原始的父进程 61 freeresource(); //只有进程退出了才goto到 lblexit,用于提醒用户进程退出了 62 //而我现在这个情况属于正常fork()守护进程后的正常退出,不应该跑到lblexit()去执行,因为那里有一条打印语句标记整个进程的退出,这里不该限制该条打印语句; 63 exitcode = 0; 64 return exitcode; //整个进程直接在这里退出 65 } 66 //走到这里,成功创建了守护进程并且这里已经是fork()出来的进程,现在这个进程做了master进程 67 g_daemonized = 1; //守护进程标记,标记是否启用了守护进程模式,0:未启用,1:启用了 68 } 69 70 //(7)开始正式的主工作流程,主流程一致在下边这个函数里循环,暂时不会走下来,资源释放啥的日后再慢慢完善和考虑 71 ngx_master_process_cycle(); //不管父进程还是子进程,正常工作期间都在这个函数里循环; 72 73 lblexit: 74 //(5)该释放的资源要释放掉 75 ngx_log_stderr(0,"程序退出,再见了!"); 76 freeresource(); //一系列的main返回前的释放动作函数 77 //printf("程序退出,再见!\n"); 78 return exitcode; 79 } 80 81 //专门在程序执行末尾释放资源的函数【一系列的main返回前的释放动作函数】 82 void freeresource() //专门将要释放的内容写成一个函数更清爽,更容易管理83 { 84 //(1)对于因为设置可执行程序标题导致的环境变量分配的内存,我们应该释放 85 if(gp_envmem) 86 { 87 delete []gp_envmem; 88 gp_envmem = NULL; 89 } 90 91 //(2)关闭日志文件 92 if(ngx_log.fd != STDERR_FILENO && ngx_log.fd != -1) 93 { 94 close(ngx_log.fd); //不用判断结果了 95 ngx_log.fd = -1; //标记下,防止被再次close吧 96 }
97 }
标签:初始化,顺序,log,lblexit,mian,代码执行,进程,ngx,exitcode From: https://www.cnblogs.com/dkhlaojogo/p/16986083.html