【读webserver代码】
命令行解析(Config类):用于个性化运行。可以设置的有如下参数:
端口号(默认9006),日志写入方式(默认同步),触发组合模式(默认listenfd LT + connfd LT),listenfd触发模式(默认LT),connfd触发模式(默认LT),优雅关闭链接(默认不使用),数据库连接池数量(默认8),线程池内的线程数量(默认8),关闭日志(默认不关闭),并发模式(默认proactor)。
在Config类的构造函数中给以上类成员赋默认值。
Config类中有一个解析函数void parse_arg(int argc, char*argv[]); 此处用到int argc, char*argv[]参数,这两个参数是从main函数中传进来的,然后传给该解析函数:config.parse_arg(argc, argv); argc表示命令行总的参数个数,argv[]表示输入的参数(一共argc个参数,第0个参数是程序的全名,后面的参数是用户输入的参数)。在这个函数中循环调用getopt(),该方法是用来分析命令行参数的,由Unix标准库提供,包含在<unistd.h>头文件中。
int getopt(int argc, char * const argv[], const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
argc、argv由main函数直接传入,表示参数的数量和参数(字符串变量数组)。
optstring:一个包含正确参数选项的字符串,用于参数的解析。例如 “abc:”,其中 -a,-b 就表示两个普通选项(选项后不带参数),-c 表示一个必须有参数的选项,因为它后面有一个冒号。一个冒号表示选项后必须有参数,没有参数就会报错(中间有无空格都行)。如果有两个冒号的话,那么这个参数就是可选参数(中间不能有空格)。
外部变量optarg:如果某个选项有参数,optarg包含当前选项的参数字符串。
getopt()每次调用会逐次返回命令行传入的参数选项。当没有参数选项了的最后一次调用时,getopt()将返回-1。所以根据getopt()的返回值来分别处理各种参数。然后通过atoi(optarg)来把当前选项的参数字符串转化成int类型,赋值给上述Config类中的成员变量。
另外,当解析到一个不在optstring里面的参数,或者一个必须有参数的选项没带参数时,返回?。如果optstring是以:开头时,确值参数的情况下会返回:而不是?。
创建WebServer类对象server,此处WebServer类把一些基本信息、数据库、线程池、epoll事件、定时器等全部封装起来了。