博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Postmaster主循环的大致流程
阅读量:6641 次
发布时间:2019-06-25

本文共 1118 字,大约阅读时间需要 3 分钟。

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,如需转载请自行联系原作者
你可能感兴趣的文章
《Perl语言入门》之六——正则表达式
查看>>
Linux之strace简单用法
查看>>
Javascript中的DOM
查看>>
按需路由原理 (ODR-On Demand Routing)
查看>>
corosync与pacemaker实现nfs作为共享存储的Mysql高可用!
查看>>
Safengine NoobyProtect 过注册半自动脚本
查看>>
redis_3.0.7_sds.c_sdsclear()
查看>>
MySQL阶段五——主从复制原理、主从延迟原理与解决
查看>>
我的友情链接
查看>>
JS 有趣的应用 : Array.prototype.slice.call(arguments,0)
查看>>
Linux命令:特殊权限SUID、GUID、Sticky
查看>>
<文明开房 低调叫床> 高考满分作文
查看>>
【Spark亚太研究院系列丛书】Spark实战高手之路-第一章 构建Spark集群(第四步)(4)...
查看>>
【linux系统优化】Selinux介绍及关闭方法
查看>>
阶段总结
查看>>
我的友情链接
查看>>
Spring aop 前置通知、后置通知、返回通知、 异常通知 、后置通知
查看>>
Android中选项卡TabHost的基本使用
查看>>
数据库优化的三个例子
查看>>
Vintage、滚动率、迁移率的应用
查看>>