goahead源码解析(一) 从主函数到I/O事件循环
一、简介
GoAhead is the world’s most popular, tiny embedded web server. It is compact, secure and simple to use. GoAhead is deployed in hundreds of millions of devices and is ideal for the smallest of embedded devices.
根据官网描述,goahead为世界上最流行的,小型嵌入式web服务器。
官网地址:https://www.embedthis.com/goahead/,官网截图如下:
支持系统:
Linux (2.6+)
Windows (7+)
MAC OS X (10.7+)
VxWorks (6.X+)
FreeBSD (10.X+)
Unix
版本号:5.1.2
是否开源:从官网看,暂未确认是否完全开源免费。
二、主函数
2.1 单任务
goahead用C语言实现,在main函数中使用单任务处理连接收发数据。对于嵌入式领域,不要求多线程高并发,此种框架可满足需求。
2.2 main()函数定义
函数定义如下,所在文件goahead-5.1.2\src\goahead.c,目前在linux系统中进行开发:
MAIN(goahead, int argc, char **argv, char **envp)
{
char *argp, *home, *documents, *endpoints, *endpoint, *route, *auth, *tok, *lspec;
int argind;
#if WINDOWS
if (windowsInit() < 0) {
return 0;
}
#endif
route = "route.txt";
auth = "auth.txt";
for (argind = 1; argind < argc; argind++) {
argp = argv[argind];
if (*argp != '-') {
break;
} else if (smatch(argp, "--auth") || smatch(argp, "-a")) {
if (argind >= argc) usage();
auth = argv[++argind];
#if ME_UNIX_LIKE && !MACOSX
} else if (smatch(argp, "--background") || smatch(argp, "-b")) {
websSetBackground(1);
#endif
} else if (smatch(argp, "--debugger") || smatch(argp, "-d") || smatch(argp, "-D")) {
websSetDebug(1);
} else if (smatch(argp, "--home")) {
if (argind >= argc) usage();
home = argv[++argind];
if (chdir(home) < 0) {
error("Cannot change directory to %s", home);
exit(-1);
}
} else if (smatch(argp, "--log") || smatch(argp, "-l")) {
if (argind >= argc) usage();
logSetPath(argv[++argind]);
} else if (smatch(argp, "--verbose") || smatch(argp, "-v")) {
logSetPath("stdout:2");
} else if (smatch(argp, "--route") || smatch(argp, "-r")) {
route = argv[++argind];
} else if (smatch(argp, "--version") || smatch(argp, "