主体逻辑
伪代码流程
main
配置加载(reload_config_file)
监控初始化(init_stats)
if (后台运行)
·makedeamon(); //fork子进程,杀死父进程
忽略pipe信号 (SIGPIPE, SIG_IGN)
开启监听端口(child_listening_sockets)
信号处理(SIGCHLD、SIGTERM、SIGHUP)
创建子进程池 child_pool_create -->用于处理连接
**child_main_loop**
检查*servers_waiting是否小于空闲的server池
if 小于
child_make():fork、子进程进入【child_main】
else
nothing
间隔5秒进行一次检查( sleep(5) )
资源回收
关闭代理
线程处理模型
使用多进程+IO复用(select)的方式处理连接
子进程逻辑(chlid_main)
chlid_main IO多路复用--select机制
初始化FD_ZERO fd_set
把所有监听端口设置为不阻塞
socket_nonblocking
开启fd集的一位 FD_SET(*fd, &rfds);
主循环(!config.quit)
select
找出可读的socket(FD_ISSET)
socket_blocking
accept
【handle_connect】
达到最大请求数量的时候退出子进程
太多空闲server,退出子进程
连接处理逻辑(handle_connect)
handle_connect
获取对端地址
socket_nonblocking
开启fd集的一位 FD_SET(*fd, &rfds);
主循环(!config.quit)
select
找出可读的socket(FD_ISSET)
socket_blocking
accept
【handle_connect】
达到最大请求数量的时候退出子进程
太多空闲server,退出子进程