原理有两点:
首先通过bind_socket()
函数创建监听套接字;
创建完毕监听套接字后就调用fcgi_spawn_connection()函数,该函数负责切换为对应的fcgi程序,以及重定向一些文件描述符:
// 如果fcgi_fd不是FCGI_LISTENSOCK_FILENO,那就通过dup2进行文件描述符的转变,核定一点的就是这个:
if(fcgi_fd != FCGI_LISTENSOCK_FILENO) {
close(FCGI_LISTENSOCK_FILENO);
dup2(fcgi_fd, FCGI_LISTENSOCK_FILENO);
close(fcgi_fd);
}
注意这里有个宏:FCGI_LISTENSOCK_FILENO,这个宏就是fcgi中监听套接字的文件描述符;
FCGI_Accept这个函数会基于FCGI_LISTENSOCK_FILENO监听套接字文件描述辅助进行accept,接着将accept到的连接设置到fcgi的输入输出文件描述符变量上,最后主流程就基于这个连接套接字进行与nginx服务器的socket数据通信。