对ListenSocket 的研究(四)

简介:
对postmaster.c 中的 readmask,rmask,nsocket等进行分析,可以看到:它们之间有如下的关系(与细节无关的代码省略):

复制代码
/*                                
 * Initialise the masks for select() for the ports we are listening on. 
 * Return the number of sockets to listen on.                                
 */                                
static int                                
initMasks(fd_set *rmask)                                
{                                
    int            maxsock = -1;                
    int            i;          
    FD_ZERO(rmask);           
    for (i = 0; i < MAXLISTEN; i++)                            
    {                            
        int fd = ListenSocket[i];
        if (fd == PGINVALID_SOCKET)                        
            break; 
        FD_SET(fd, rmask);     
        if (fd > maxsock)                        
            maxsock = fd;                    
    }                        
    return maxsock + 1;                            
}
复制代码

复制代码
static int                                
ServerLoop(void)                                                    
{                                        
    ......                             
    nSockets = initMasks(&readmask);    
    for (;;)                                    
    {                                    
        fd_set        rmask;                        
        int            selres;                    
                                        
        /*                                
         * Wait for a connection request to arrive.  
         * We wait at most one minute, to ensure that the other background 
         * tasks handled below get done even when no requests are arriving. 
         * If we are in PM_WAIT_DEAD_END state, then we don't want to accept 
         * any new connections, so we don't call select() at all; just sleep  
         * for a little bit with signals unblocked.                                
         */                                
        memcpy((char *) &rmask, (char *) &readmask, sizeof(fd_set));   
                                        
        PG_SETMASK(&UnBlockSig);       
        if (pmState == PM_WAIT_DEAD_END)                                
        {                                
            ...                            
        }                                
        else                                
        {                                
            ...                         
            selres = select(nSockets, &rmask, NULL, NULL, &timeout); 
        }                                
                                     
        /*                                
         * Block all signals until we wait again.  (This makes it safe for our  
         * signal handlers to do nontrivial work.)                                
         */                                
        PG_SETMASK(&BlockSig);                                
                                        
        /* Now check the select() result */                                
        if (selres < 0)                                
        {                                
            ...                            
        }                                
                                        
        /*                                
         * New connection pending on any of our sockets? If so, fork a child 
         * process to deal with it.                                
         */                                
        if (selres > 0)                                
        {                                
            ...                            
        }                             
        ...                                
    }                                    
}
复制代码
可以看出来,nsocket就是用于监听网络通信的地 fd_set中的文件描述符最大值+1。
至于原始的文件描述符,就是来自于 ListenSocket数组。
为了进一步研究,还需要从源头上看ListenSocket是如何被赋值的。

 






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

目录
相关文章
|
JSON 监控 安全
idor相关研究
前言 本文主要阐述了挖掘IDOR的主要流程,以及挖掘的一般性思路(主要从六个角度展开),更多的还要靠读者去实践。
168 0
idor相关研究
|
机器学习/深度学习 计算机视觉
深度学习研究现状
近年来,深度学习逐渐成为⼈⼯智能领域的研究热点和主流发展⽅向。深度学习是由多个处理层组成的计算模型,学习具有多个抽象层次的数据表示的机器学习技术。深度学习代表了机器学习和⼈⼯智能研究的主要发展⽅向,给机器学习和计算机视觉等领域带来了⾰命性的进步。本⽂旨在分析深度学习技术的现状。
1393 1
|
机器学习/深度学习 算法 数据可视化
NeurIPS 2019:两种视角带你了解网络可解释性的研究和进展
一直以来,深度网络在图像识别,检测,语言等领域都有强大的能力。研究者们的重点都在如何提升网络性能上,很少有人能说清楚深度神经网络为何能够得到较好的泛化能力,有的研究者习惯从原理上来说明这个问题,有的研究者则会从中间结果来解释,当然这些观点都各有千秋。在 NeurIPS 2019 上,有些学者在网络的可解释性上发表了自己的研究。
192 0
NeurIPS 2019:两种视角带你了解网络可解释性的研究和进展
|
SQL 存储 Go
AutoAudit研究学习
AutoAudit介绍   AutoAudit这个是Paul Nielsen写的一个开源的审计跟踪的脚本项目,项目位于https://autoaudit.codeplex.com/上,Paul Nielsen的一篇博客CodeGen to Create Fixed Audit Trail Triggers上也介绍了他创建这个项目的前因后果。
1275 0
神经影像学靶点研究取得进展
中国科学院自动化研究所面向脑科学与信息科学交叉前沿,发现了一组通用的多模态磁共振影像学靶点, 可实现精神分裂症多种认知能力的个体化预测,并成功在多中心验证推广,深入揭示了精神分裂症认知损伤所影响的多模态交互环路,为建立基于客观标记物的个体化治疗系统奠定基础。  
1539 0
自抗凝透析器研究取得系列进展
刘富研究员团队在膜微孔结构调控、膜表面抗凝分子修饰、自抗凝透析器方面取得系列进展,实现无肝素透析是血液透析发展趋势,为慢性肾病患者送来福音。
1746 0
|
SQL 关系型数据库 PostgreSQL