4.1.3 main函数主体流程
2016-04-07 10:27
459 查看
master.c共定义了3个函数,其中最主要就是main函数,其他的两个小工具函数如下,分别提供退出master进程和显示提示信息的功能:
我们来看一下master.c main函数主体流程:
master.c的main函数从242行到549行,前面的242到499行需要进行一些postfix自身需要的预处理工作和unix守护进程的常规设置,见4.1.4。剩下的主体部分层层封装,主要完成以下工作:
1 “读”:读取master.cf配置文件,根据其内容初始化读到的业务模块的MASTER_SERVER结构体,并组成链表。
2 “听”:根据模块监听类型(inet、unix、fifo)开启监听,返回文件描述符。
3 “挂”:为模块挂载回调函数,这个挂载的回调函数master_avail_event是“活的”,也即可以通过master_spawn函数新建进程。
4 “主循环”:开启事件循环侦听事件。
500行的master_config函数本身完成“读”的工作,对读到的模块执行的master_service_start函数执行“听”、“挂”的工作,然后在主函数中继续完成“主循环”的工作。
/master/master.c 223 /* master_exit_event - exit for memoryleak testing purposes */ 224 225 static void master_exit_event(intunused_event, void *unused_context) 226 { 227 msg_info("master exit time has arrived"); 228 exit(0); 229 } 230 231 /* usage - show hint and terminate */ 232 233 static NORETURN usage(const char *me) 234 { 235 msg_fatal("usage: %s [-c config_dir] [-D (debug)] [-d (don't detachfrom terminal)] [-e exit_time] [-t (test)] [-v] [-w (wait forinitialization)]", me); 236 }
我们来看一下master.c main函数主体流程:
/master/master.c 242 int main(int argc, char **argv) 243 { 500 master_config(); 501 master_sigsetup(); 502 master_flow_init(); 503 msg_info("daemon started -- version %s, configuration %s", 504 var_mail_version, var_config_dir); 521 #define MASTER_WATCHDOG_TIME 1000 522 523 watchdog = watchdog_create(MASTER_WATCHDOG_TIME, (WATCHDOG_FN) 0, (void*) 0); 524 for (;;) { 533 watchdog_start(watchdog); /* same as trigger servers */ 534 event_loop(MASTER_WATCHDOG_TIME / 2); 535 if (master_gotsighup) { 536 msg_info("reload -- version%s, configuration %s", 537 var_mail_version,var_config_dir); 538 master_gotsighup = 0; /* this first */ 539 master_vars_init(); /* then this */ 540 master_refresh(); /* then this */ 541 } 542 if (master_gotsigchld) { 543 if (msg_verbose) 544 msg_info("got sigchld"); 545 master_gotsigchld = 0; /* this first */ 546 master_reap_child(); /* then this */ 547 } 549 }
master.c的main函数从242行到549行,前面的242到499行需要进行一些postfix自身需要的预处理工作和unix守护进程的常规设置,见4.1.4。剩下的主体部分层层封装,主要完成以下工作:
1 “读”:读取master.cf配置文件,根据其内容初始化读到的业务模块的MASTER_SERVER结构体,并组成链表。
2 “听”:根据模块监听类型(inet、unix、fifo)开启监听,返回文件描述符。
3 “挂”:为模块挂载回调函数,这个挂载的回调函数master_avail_event是“活的”,也即可以通过master_spawn函数新建进程。
4 “主循环”:开启事件循环侦听事件。
500行的master_config函数本身完成“读”的工作,对读到的模块执行的master_service_start函数执行“听”、“挂”的工作,然后在主函数中继续完成“主循环”的工作。
相关文章推荐
- 3.8.3 MAIL_STREAM流
- [POJ 1691]Painting A Board[DFS][排序]
- go away, white hair
- Uncaught SecurityError: Failed to execute 'replaceState' on 'History':解决方案
- 不启动Solr,使用Solr的analyzer chain (使用mmseg4j分词)
- ApiDemo/FragmentRetainInstance 解析
- Airtable(数据管理)
- Airtable(数据管理)
- Airtable(数据管理)
- Climbing Stairs
- [LeetCode] Duplicate Emails 重复的邮箱
- liunx 下scp出现 Permission denied, please try again 的解决办法
- Nexus启动失败处理:The nexus service was launched, but failed to start.
- AIDL实例浅析
- Airtable(数据管理)
- could not bind to address 0.0.0.0:443 no listening sockets available, shutting d
- Mesos 维护原语 (Maintenance Primitives)
- LeetCode *** 70. Climbing Stairs
- 【一天一道LeetCode】#11Container With Most Water
- 【一天一道LeetCode】#11Container With Most Water