1.几个重要的全局变量与短选项和长选项的概念:
extern char *optarg;
extern int optind, opterr, optopt;
- 全局变量解释
- optarg:如果选项带参数,则参数的值保存在optarg中。如果选项带可选参数,而实际无参数时,optarg为NULL。
- optind:argv数组中下一次需要处理的元素的下标,系统默认初始化此值为1。0是没有意义的,因为argv[0]为程序名,在解析命令行参数中是没有意义的。
- opterr
- optopt
- GNU/Linux的命令行选项有两种类型:短选项和长选项 1. 短选项:以'-'作为前导符,例如
-n
表示是一个不带参数的短选项。
2. 长选项:以'--'作为前导符。--n
表示是一个不带参数的长选项。
1.getopt函数:短选项解析函数
- 函数声明:
#include <unistd.h>
int getopt(int argc, char * const argv[],
const char *optstring);
- 函数参数:
- argc:实参个数
- argv:一个数组,元素为各个实参
- optstring:一个包含合法选项字符的字符串。
- 如果选项带参数,该选项后接冒号,比如optstring这个实参值为"a:b",则表示a必须带参数,b没有参数;
- 如果选项带可选参数,该选项后接两个冒号,比如"a::b",表明a可能有参数,也可能没有;
- 如果optstring的开头字符为':',表明如果指明选项带参数,而实际命令行没有参数时,getopt返回':'而不是'?'(默认情况下返回
'?'
,和无法识别的选项参数返回一样);
- 返回值:
- 该函数每解析完一个选项,就返回该选项字符。选项字符解析完毕后,调用getopt函数将会返回-1
- 当调用getopt函数检测到错误时(比如说检测到的选项字符不在optstring实参中),默认情况下函数返回'?'。
- If getopt() encounters an option with a missing argument, then the re‐
turn value depends on the first character in optstring: if it is ':', then ':' is returned; otherwise '?'
is returned.
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
int flags, opt;
int nsecs, tfnd;
nsecs = 0;
tfnd = 0;
flags = 0;
//因为短选项解析完毕后getopt函数返回-1,所以作为循环退出的条件
//optstring这个实参的值为"nt:",意思是说n这个选项不带参数,t这个选项带有一个参数
while ((opt = getopt(argc, argv, "nt:")) != -1) {
switch (opt) {
case 'n':
flags = 1;
break;
case 't':
printf("arg t value:%s\n", optarg);
nsecs = atoi(optarg);
tfnd = 1;
break;
default: /* '?' */
fprintf(stderr, "Usage: %s [-t nsecs] [-n] name\n",
argv[0]);
exit(EXIT_FAILURE);
}
}
printf("flags=%d; tfnd=%d; nsecs=%d; optind=%d,argc=%d\n",
flags, tfnd, nsecs, optind,argc);
//optind这个全局变量默认初始化为1,不指定命令行参数argc就为1
if (optind >= argc) {
fprintf(stderr, "Expected argument after options\n");
exit(EXIT_FAILURE);
}
//如果函数解析完毕,那么argv[optind]的值重置为argv数组中第一个不是选项的元素
//比如说./a.out -n 5 -t 100这样,optind为4
printf("optind:%d,name argument = %s\n", optind, argv[optind]); // 4,5
exit(EXIT_SUCCESS);
}
运行示例:
root@hecs-205584:~/mprpc/tinyRPC/src# ./a.out -t 100 -n 5
arg t value:100
flags=1; tfnd=1; nsecs=100; optind=4,argc=5
optind:4,name argument = 5