您的位置:首页 > 大数据 > 人工智能

4.1.3 main函数主体流程

2016-04-07 10:27 459 查看
master.c共定义了3个函数,其中最主要就是main函数,其他的两个小工具函数如下,分别提供退出master进程和显示提示信息的功能:

/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函数执行“听”、“挂”的工作,然后在主函数中继续完成“主循环”的工作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: