postmaster.c 中,主循环的大致流程如下:
* Main idle loop of postmaster
nSockets = initMasks(&readmask);
if (pmState == PM_WAIT_DEAD_END)
selres = select(nSockets, &rmask, NULL, NULL, &timeout);
/* Now check the select() result */
if (errno != EINTR && errno != EWOULDBLOCK)
* New connection pending on any of our sockets? If so, fork a child
* process to deal with it.
for (i = 0; i < MAXLISTEN; i++)
if (ListenSocket[i] == PGINVALID_SOCKET)
if (FD_ISSET(ListenSocket[i], &rmask))
port = ConnCreate(ListenSocket[i]);
BackendStartup(port); /*To fork a new backend */
从上面可以看出,基本上是以 C语言的标准select函数 来监听是否有新的连接请求进来。如果有连接请求则调用BackendStartup 函数,开启新的backend 处理连接。
这里面比较令我困惑的是:for (i = 0; i < MAXLISTEN; i++) 循环,对BackendStartup 函数的调用是发生在循环内部。ListenSocket 数组如何理解。需要进一步的研究。
本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/07/20/2600479.html,如需转载请自行联系原作者