Postmaster主循环的大致流程

postmaster.c 中,主循环的大致流程如下:

复制代码
/*                                    
 * Main idle loop of postmaster                                    
 */                                    
static int                                    
ServerLoop(void)                                    
{                                    
    ......                       
    nSockets = initMasks(&readmask);                                
                              
    for (;;)                                
    {                                
        ...                                        
        if (pmState == PM_WAIT_DEAD_END)                            
        {
            ...
        }                            
        else                            
        {
            ...                                                     
            selres = select(nSockets, &rmask, NULL, NULL, &timeout);   
        }                            
        ...                           
                                    
        /* Now check the select() result */                            
        if (selres < 0)                            
        {                            
            if (errno != EINTR && errno != EWOULDBLOCK)                        
            {                        
                ......           
                return STATUS_ERROR;                    
            }                        
        }                            
                                    
        /*                            
         * New connection pending on any of our sockets? If so, fork a child 
         * process to deal with it.                            
         */                            
        if (selres > 0)                            
        {                            
            int            i;            
                                    
            for (i = 0; i < MAXLISTEN; i++)                        
            {                        
                if (ListenSocket[i] == PGINVALID_SOCKET)                    
                    break;                
                                    
                if (FD_ISSET(ListenSocket[i], &rmask))                    
                {                    
                    Port       *port; 
                    port = ConnCreate(ListenSocket[i]);                
                                    
                    if (port)                
                    {                
                        BackendStartup(port);   /*To fork a new backend */         
      
                        StreamClose(port->sock);            
                        ConnFree(port);            
                    }                
                }                    
            }                        
        }                            
                                    
        ......                        
    }                                
}                                    
复制代码
从上面可以看出,基本上是以 C语言的标准select函数 来监听是否有新的连接请求进来。如果有连接请求则调用BackendStartup 函数,开启新的backend 处理连接。

这里面比较令我困惑的是:for (i = 0; i < MAXLISTEN; i++) 循环,对BackendStartup 函数的调用是发生在循环内部。ListenSocket 数组如何理解。需要进一步的研究。








本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/07/20/2600479.html,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值