服务器SHTTPD的命令行解析,需要进行大量的命令行字符串解析,程序设计起来比较麻烦。
幸好,GNU C库有一个命令行解析函数。使用此函数可以节省大量的时间,将主要的思想用在业务处理上。使用gcc的getopt_long()函数可以自动地进行命令行解析程序设计。使用getopt_long()需要引入头文件getopt.h。其函数的声明如下:
#include <getopt.h>
int getopt_long(int argc, char * const argv[], const char *optstring,
const struct option *longopts, int *longindex);
参数说明:
q 参数argc:表示输入参数的个数,与参数argv通常都是从main()函数的输入参数中直接传递过来的。
q 参数argv:表示输入参数的字符串数组。
q 参数optstring:是选项组成的字符串,如果该字符串里任一字母后有冒号,那么这个选项就要求有参数。例如,某个命令的选项字符串为c:h,则可以使用-c xxx这种带参数的选项,而-h选项不需要参数。
q 参数longopts:是长参数选项,下一个是指向数组的指针,这个数组是option结构数组,option结构称为长选项表。其声明如下:
struct option
{
const char *name;
int has_arg;
int *flag;
int val;
};
结构中的元素解释如下:
q 参数name:选项名,即进行参数判定时的匹配字符串。
q 参数 has_arg:描述长选项是否有参数,其值见表18.2。
表18.2 结构option的成员flag的含义
符 号 常 量 |
数值 |
含 义 |
no_argument |
0 |
选项没有参数 |
required_argument |
1 |
选项需要参数 |
optional_argument |
2 |
选项参数是可选的 |
q 参数flag,如果该指针为NULL,那么getopt_long()函数返回的为对应val字段的值;如果该指针不为NULL,那么会使得它所指向的结构填入val字段的值,同时getopt_long返回0。
q 参数 val,如果flag是NULL,那么val通常是个字符常量,如果短选项和长选项一致,那么该字符就应该与optstring中出现的这个选项参数相同。
如图18.7所示为SHTTPD服务器命令行解析的含义,其长参数、短参数匹配字符和含义如表18.3所示。
表18.3 SHTTPD服务器命令行解析的含义
长参数字符串 |
短参数字符串 |
匹 配 字 符 |
含 义 |
--CGIRoot |
-c |
c |
CGI根路径 |
--DefaultFile |
-d |
d |
目录下默认文件 |
--ConfigFile |
-f |
f |
配置文件名称 |
--DocumentRoot |
-o |
o |
网站根目录 |
--ListenPort |
-l |
l |
服务器侦听端口 |
--MaxClient |
-m |
m |
最大客户端数量 |
--TimeOut |
-t |
t |
连接超时时间 |
--Help |
-h |
h |
帮助 |
设置如下形式的参数来提供命令行参数选项的解析,其中短参数类型为:
"c:d:f:ho:l:m:t:";
对应的长参数类型为:
{"CGIRoot", required_argument, NULL, 'c'},
{"ConfigFile", required_argument, NULL, 'f'},
{"DefaultFile", required_argument, NULL, 'd'},
{"DocumentRoot", required_argument, NULL, 'o'},
{"ListenPort", required_argument, NULL, 'l'},
{"MaxClient", required_argument, NULL, 'm'},
{"TimeOut", required_argument, NULL, 't'},