boa源码分析

boa应用程序从src/boa.c开始运行,进入关键的select_loop中,boa将处于无阻塞轮询运行服务中。

/* boa里边有三个请求链表
* request *request_ready = NULL;  /* ready list head */
* request *request_block = NULL;   /* blocked list head */
* request *request_free = NULL;      /* free list head */
*
/


#include "boa.h"

static void fdset_update(void);
fd_set block_read_fdset;
fd_set block_write_fdset;
static struct timeval req_timeout;     /* timeval for select */

void select_loop(int server_s)
{
    FD_ZERO(&block_read_fdset);           //清空,block_read_fdset、block_write_fdset;
    FD_ZERO(&block_write_fdset);
    /* set server_s and req_timeout */       //设置server_s和请求超时时间。
    req_timeout.tv_sec = (ka_timeout ? ka_timeout : REQUEST_TIMEOUT);
    req_timeout.tv_usec = 0l;   /* reset timeout */

    /* preset max_fd */   
    max_fd = -1;           

    while (1) {       //进入web server服务主循环
        if (sighup_flag)         //处理sighup 、  sigchld 、 sigalrm、 sigterm等信号。
            sighup_run();      
        if (sigchld_flag)
            sigchld_run();
        if (sigalrm_flag)
            sigalrm_run();

        if (sigterm_flag) {
            if (sigterm_flag == 1)
                sigterm_stage1_run(server_s);
            if (sigterm_flag == 2 && !request_ready && !request_block) {
                sigterm_stage2_run();
            }
        }

        /* reset max_fd */
        max_fd = -1;         //重置max_fd为-1;

        if (request_block)       //如果request_block里面有request,则将合适的request从block链表里移到ready链表里。
            /* move selected req's from request_block to request_ready */
            fdset_update();

        /* any blocked req's move from request_ready to request_block */
        process_requests(server_s);   //处理request ,将blocked request从ready链移至block链

        if (!sigterm_flag && total_connections < (max_connections - 10)) {
            BOA_FD_SET(server_s, &block_read_fdset); /* server always set */
        }
                                         //重置时间
        req_timeout.tv_sec = (request_ready ? 0 :
                              (ka_timeout ? ka_timeout : REQUEST_TIMEOUT));
        req_timeout.tv_usec = 0l;   /* reset timeout */

        if (select(max_fd + 1, &block_read_fdset,     //进入select轮询
                   &block_write_fdset, NULL,
                   (request_ready || request_block ? &req_timeout : NULL)) &
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值