GoAhead 2.1.8嵌入式webserver源码分析学习(三)---main函数分析

一、GoAhead嵌入式webserver--LINUX分支

    在源码中的LINUX文件夹里面含有一个main.c文件以及一个Makefile文件,需要编译LINUX环境下的webserver程序,只需要make一下就行了。在这里就针对这个main的主函数进行分析,然后再进行树藤摸瓜进一步的分析源码,在目前的这些函数分析目前只能是对函数功能做出分析,还不能深入到整个webserver运行机制流程方面有个很好的理解。所以分析会有点乏味,但是其中的一些函数还有写得非常好的,具有很好的参考性。


二、原代码片段

int main(int argc, char** argv)
{

	bopen(NULL, (60 * 1024), B_USE_MALLOC);
	signal(SIGPIPE, SIG_IGN);


	if (initWebs() < 0) {
		return -1;
	}


	while (!finished) {
		if (socketReady(-1) || socketSelect(-1, 1000)) {
			socketProcess(-1);
		}
		websCgiCleanup();
		emfSchedProcess();
	}

	websCloseServer();
	socketClose();

	bclose();
	return 0;
}
以上就是一些源码,我将其中的一些SSL加密以及用户管理方面的代码删除掉了,这些并没有在这里贴出来,有兴趣的可以查看下源码。

三、main函数结构分析

    在main函数中,总共有几个函数分别为 bopen()、 initWebs()、 socketReady()、socketSelect()、socketProcess()、websCgiCleanup()、emfSchedProcess()、webCloseServer()、socketClose()、bclose() 。

    在这些函数中,根据一般程序或者系统运行的规律,肯定是分成三个部分。


    第一个部分就是整个主业务流程在运行之前,肯定是要将整个资源准备好,进行必要的初始化操作,在这里数据第一部分的就是 这两个函数: bopen()、 initWebs()。 bopen函数是程序自己申请一段内存的函数,GoAhead说最小仅仅需要60K的内存就能运行起来就得益于她自己的一套内存申请使用管理的办法。initWebs函数就是进行一些网络资源的初始化,例如默认网页,函数处理句柄数组,网络监听套接字、端口。


    第二个部分就是程序主程序运行起来之后进入一个死循环,不断的去监听请求、处理请求、回复请求。在while循环里面的函数就是这些功能: socketReady()、socketSelect()、socketProcess()、websCgiCleanup()、emfSchedProcess()。


    第三部分就是当循环结束后,需要进行资源的释放,尤其是对malloc内存的释放问题,还有一些文件句柄的关闭问题,都是需要经过很好的处理才能退出整个程序的运行。后面的几个close函数就是起到了这个作用:webCloseServer()、socketClose()、bclose() 。


四、总结

    以上就是对于main函数的分析总结,主要是要了解程序运行的那三个部分,才能很好的进行针对性的学习和函数分析。

你可能感兴趣的:(Linux,C)