getopt/getopt_long函数进行参数解析
1.参数原型
getopt()函数的参数原型
int getopt(int argc, char * const argv[], const char *optstring);
getopt_long()函数的参数原型
int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
getopt函数只能处理短选项,而getopt_long函数两者都可以。通常情况下我们都是使用getopt_long()函数。
2.参数和返回值分析
-
argc, argv参数和main()函数的参数一致,这里就不做过多介绍。
-
optstring: 表示短选项字符串。且规范格式如下:
1)单个字符为参数选项
2)选项字符后面跟“:”,表示该选项必须具备参数,参数与选项之间必须有空格分隔, 如:start -f flile。
3)选项字符后面跟“::”, 表示该选项必须具备参数,且参数紧跟选项,二者连在一起,例如:start -ffile 。 -
struct option* longopts:长选项结构体,保存长选项的信息。
struct option
{
const char *name;
int has_arg;
int *flag;
int val;
}
1)name:长选项的名字
2)has_arg:如果选项不带参数,则值为no_argument(或0);如果选项需要参数,则值为required_argument (或 1);或者如果选项接受可选参数,则值为optional_argument(或2)。
3) flag:指定如何返回长选项的结果。如果标志为空,则getopt_long()返回参数val的值(例如调用程序可能会将val设置为等效的短选项字符。)否则,getopt_long()返回0,flag指向一个变量,该变量设置为参数val的值;
4) val:要返回的值,或加载到flag参数指向的变量中的值
5) 该结构体的最后一个元素必须用0来填充
- longindex:如果longindex不为空,则指向一个变量,该变量设置为长选项相对于longopts的索引(即数组的下标值)。
- 返回值
1)如果短选项找到,那么将返回短选项对应的字符。
2)如果长选项找到,如果flag为NULL,返回val。如果flag不为空,返回0
3)如果遇到一个选项没有在短字符、长字符里面。或者在长字符里面存在二义性的,返回“?”
4)如果解析完所有字符没有找到(一般是输入命令参数格式错误,eg: 连斜杠都没有加的选项),返回“-1”
5)如果选项需要参数,忘了添加参数。返回值取决于optstring,如果其第一个字符是“:”,则返回“:”,否则返回“?”。
3.代码示例
struct option long_options[] =
{
{"daemon", no_argument, NULL, 'b'},
{"port", required_argument, NULL, 'p'},
{"help", no_argument, NULL, 'h'},
{NULL, 0, NULL, 0}
};
opt = getopt_long(argc, argv, "bp:h", long_options, NULL)
if(opt == -1)
break;
switch(opt)
{
case 'b':
daemon_run = 1;
break;
case 'p':
serv_port = atoi(optarg);
break;
case 'h':
print_usage(progname);
return EXIT_SUCCESS;
default:
break;
}