start_vrrp_child
1,创建子进程
2,父进程执行 thread_add_child,并推出
2.1 定义新的 thread_t 对象,并进行根据给定参数进行初始化,线程id,处理函数等
vrrp_respawn_thread :
判断如果进程类型为 THREAD_CHILD_TIMEOUT,则再次执行 thread_add_child,并返回
如果不是此种类型,则 start_vrrp_child
2.2 调整时间
2.2 按时间从小到大排序插入队列
3,子进程将pid写入 vrrp_pidfile中
4,清理掉从父进程继承的信号处理,以及thread_master_t,并创建新的master:
master = thread_make_master();
5,改变目录到 "/"
6,umask(0)
7,UNSET_RELOAD
8,vrrp_signal_init():
8.1 signal_handler_init():创建pipe,对signal_SIGHUP_handler,signal_SIGINT_handler,signal_SIGTERM_handler,signal_SIGCHLD_handler进行初始化为NULL
8,2 signal_set(SIGHUP, sighup_vrrp, NULL);
8.2.1 sighup_vrrp:thread_add_event(master, reload_vrrp_thread, NULL, 0); thread_new 一个thread,将其加入到 m->event 队列
8.3 signal_set(SIGINT, sigend_vrrp, NULL); signal_set(SIGTERM, sigend_vrrp, NULL);
thread_add_terminate_event(master);
8.4 signal_ignore(SIGPIPE);
signal_set(signo, NULL, NULL): switch 设置
signal_SIGHUP_handler,signal_SIGHUP_v,signal_SIGINT_handler
,signal_SIGINT_v,signal_SIGTERM_handler,signal_SIGTERM_v,
signal_SIGCHLD_handler,signal_SIGCHLD_v
9,start_vrrp():
9.1 init_interface_queue(netlink库的使用具体待学习)
9.1.1 init_if_queue(): if_queue = alloc_list(free_if, dump_if);
9.1.2 netlink_interface_lookup():
9.1.2.1 声明结构体:struct nl_handle nlh, 调用netlink_set_block