首页 > 其他分享 >mian函数中代码执行顺序

mian函数中代码执行顺序

时间:2022-12-15 22:00:45浏览次数:48  
标签:初始化 顺序 log lblexit mian 代码执行 进程 ngx exitcode

/*
* 自己写程序最好是参照下面的书写过程
**/
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

相关文章

  • 类的初始化顺序
    一、无继承类的初始化顺序。执行顺序:静态块--->>main()函数--->>构造块--->>构造方法。1、静态代码块。用staitc声明,jvm加载类时执行,仅执行一次。(类初始化一次)(1)静态代码块其......
  • Python实现从一个列表数据里随机抽取数据,并且按原有顺序排序
    背景:工作中需要实现从多个条件中随机抽取几个条件,进行组合查询的功能。而查询的结果需要按原顺序进行判断是否符合查询条件。分析:这些条件可以放在列表里,这就需要实现一个......
  • 调整数组顺序使奇数位于偶数前面
    输入一个整数数组,实现一个函数来调整该数组中数字的顺序。使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分。classSolution{public:voidreOrde......
  • taro 编译报:模块引入顺序不一致报错
    前情最近在开发一个小程序项目,基于公司的技术栈是React,于是使用Taro来开发小程序。坑位在开发中经常性的报类似如下的错误,大致意思是说你引入模块的顺序在不同模块中......
  • pgadmin4 远程代码执行漏洞复现(CVE-2022-4223)
    影响版本<6.17漏洞分析就是os.path.abspath(os.path.join(...))可以访问远程UNC路径的文件,subprocess.getoutput()函数触发执行文件。漏洞代码@blueprint.route(......
  • 线性表(链表,顺序表)讲解_legend
    线性表(linearList)(1)线性表的定义:节点(node)之间具有一对一的前驱后继关系(2)线性表的存储结构:(2.1)顺序表(sequenceList):(2.2)链式表(linkList):(3)顺序表的常见操作:(初始化+增删改......
  • 不改变相对顺序,负数左边正数右边
    不改变正负数之间的相对顺序重新排列数组,使得负数位于正数之前;(1)举例:如:1,7,-5,2,-9,3变成-5,-9,1,7,2,3(2)方法一:从头到尾扫描数组,每次碰到一个正数时,就把位于这个数字之......
  • 顺序程序设计
    顺序程序设计三种基本结构顺序结构:代码从前往后依次按顺序运行选择结构:根据条件选择运行某部分代码循环结构:反复执行某部分代码数据形式常量和变量数据有两种表现......
  • 对于async和await的使用同步、异步、顺序执行方式
    结论同步还是异步,区别如下:同步:你使用 await 修饰符去调用一个异步(async)方法(是异步方法,不过是阻塞式的,可简单理解为同步);异步:你获取异步方法返回的 Task,就是异步(后文......
  • animation顺序 及案例
    animation 属性是 animation-name,animation-duration, animation-timing-function,animation-delay,animation-iteration-count,animation-direction,animation-fill-mode ......