Linux之getopt

研究netmap代码的时候,碰巧就了解了下关于配置参数的问题,促使我去研究的原因是每次安装源代码,需要自己

进行编译链接都会用到./configure,当最后编译链接完成后,若是要运行程序,少不了要在可执行程序后面添加参数,

其中有个最常见的就是 --help,不过这里不讲这个,将一个更简单的  -h ,比如见得最多的 gcc -o 字段  ,那么这个是怎么

实现的呢?

函数getopt很好的解决了这个问题,可通过man手册查看(man 3 getopt)直接看代码:

#include
#include
#include
int main(int argc,char *argv[]){
    int ch; //用来存储选项的ASSIC值
    while((ch = getopt(argc,argv,":hct:")) != -1){                  //":hct:"   的解释可以查看manshouc,简介第一个:表示给出了  -t  但是没有参数时返回:
        printf("optind=%d\n",optind);           //该值是系统定义的变量,初始化值为1,主要指向argv[]的字段,argv[0]为程序名称,从1开始
        printf("option = %c\n",ch);
        switch(ch){
            case 'h':                             //当可执行程序中有  -h  字段是打印帮助信息
                printf("Usage:%s [-h] [-c] [-t argument]\n",argv[0]);
                break;
            case 'c':                            //这个是测试
                printf("%c doesn't have an argument!\n",ch);
                break;
            case 't':
                printf("%c has an argument %s\n",ch,optarg);       //当可执行程序后出现   -t  时其后空格就是其参数,通过系统变量指针optarg获取
                break;
            case '?':                          //当出现的选项不存在时返回?
                printf("the option didn't exsit!\n");
                printf("Usage:%s [-h] [-c] [-t argument]\n",argv[0]);
                break;
            case ':':                           //当出现的选项需要带参数,而实际没有给参数时,返回:    ,可以参考运行结果
                printf("option %s missing an argument!\n",argv[--optind]);
                printf("Usage:%s [-h] [-c] [-t argument]\n",argv[0]);
                optind++;
                break;
        }
    }
    return 0;
}


测试结果如下:

测试一:

[root@localhost tmp]# ./test -c -t test
optind=2
option = c
c doesn't have an argument!
optind=4
option = t
t has an argument test

测试二:

[root@localhost tmp]# ./test -t
optind=2
option = :
option -t missing an argument!
Usage:./test [-h] [-c] [-t argument]

测试三:

[root@localhost tmp]# ./test -l
optind=2
option = ?
the option didn't exsit!
Usage:./test [-h] [-c] [-t argument]

上述就是一个框架,可以根据需求进行添加,更进一步的像--help的实现方法下次有空再更新。


你可能感兴趣的:(Linux库函数)