1.几个重要的全局变量与短选项和长选项的概念:

 extern char *optarg;
 extern int optind, opterr, optopt;
  1. 全局变量解释
    1. optarg:如果选项带参数,则参数的值保存在optarg中。如果选项带可选参数,而实际无参数时,optarg为NULL。
    2. optind:argv数组中下一次需要处理的元素的下标,系统默认初始化此值为1。0是没有意义的,因为argv[0]为程序名,在解析命令行参数中是没有意义的。
    3. opterr
    4. optopt
  2. GNU/Linux的命令行选项有两种类型:短选项和长选项 1. 短选项:以'-'作为前导符,例如-n表示是一个不带参数的短选项。
    2. 长选项:以'--'作为前导符。--n表示是一个不带参数的长选项。

1.getopt函数:短选项解析函数

  1. 函数声明:
#include <unistd.h>

int getopt(int argc, char * const argv[],
          const char *optstring);
  1. 函数参数:
    1. argc:实参个数
    2. argv:一个数组,元素为各个实参
    3. optstring:一个包含合法选项字符的字符串。
      1. 如果选项带参数,该选项后接冒号,比如optstring这个实参值为"a:b",则表示a必须带参数,b没有参数;
      2. 如果选项带可选参数,该选项后接两个冒号,比如"a::b",表明a可能有参数,也可能没有;
      3. 如果optstring的开头字符为':',表明如果指明选项带参数,而实际命令行没有参数时,getopt返回':'而不是'?'(默认情况下返回'?',和无法识别的选项参数返回一样);
  2. 返回值:
    1. 该函数每解析完一个选项,就返回该选项字符。选项字符解析完毕后,调用getopt函数将会返回-1
    2. 当调用getopt函数检测到错误时(比如说检测到的选项字符不在optstring实参中),默认情况下函数返回'?'。
    3. 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