popt简单使用

概述

popt是linux下的用于进程的命令行解析接口。简单的popt使用涉及以下数据结构和函数:

  • struct poptOption
struct poptOption  {
     const  char  * longName ;  /* 选项的长名称,可以是NULL */
     char shortName ;         /* 选项的短名称,可以是'\0' */
     int argInfo ;				/* 参数类型 */
     void  * arg ;             /* 根据参数类型,将参数解析后记录在arg里 */
     int val ;                /* 匹配上选项后调用poptGetNextOpt的返回值,0表示无返回值 */
     char  * descrip ;         /* 指向选项说明文字,使用popt自带的帮助作选项说明,使用时需要带上POPT_AUTOHELP参数,可以为NULL */
     char  * argDescrip ;      /* 指向参数说明文字,使用popt自带的帮助作参数说明,使用时需要带上POPT_AUTOHELP参数,可以为NULL */
} ;
	arginfo的可选项如下所示:
    Value             Description                        arg Type
    POPT_ARG_NONE     No argument expected               int
    POPT_ARG_STRING   No type checking to be performed   char *
    POPT_ARG_INT      An integer argument is expected    int
    POPT_ARG_LONG     A long integer is expected         long
    POPT_ARG_VAL      Integer value taken from val       int
    POPT_ARG_FLOAT    An float argument is expected      float
    POPT_ARG_DOUBLE   A double argument is expected      double

  • poptGetContext
poptContext poptGetContext ( const  char  * name ,  int argc ,
                            const  char  ** argv ,
                            const  struct poptOption  * options ,
                            int flags ) ;
name: 一般是程序名
argc: 选项参数数目
argv: 指向选项参数的指针
options: 定义好的poptOption表
flags: 标志,一般用0就可以
  • poptGetNextOpt
int poptGetNextOpt (poptContext con );
用于获取下一个选项,返回poptOption中的val字段

简单实例

参数解析

#include <stdio.h>
#include <unistd.h>
#include <popt.h>

int
main(int argc, char **argv)
{
    poptContext context;
    int c;
    char *optarg = NULL;
    struct poptOption options_table[] = {
        { "add-service", 'A', POPT_ARG_NONE, NULL, 'A', NULL, NULL},
        { "tcp-service", 't', POPT_ARG_STRING, &optarg, 't',NULL ,NULL},
        { NULL, 0, 0, NULL, 0}
    };
    
    context = poptGetContext("jiangxq", argc, (const char **)argv,
				 options_table, 0);

    while ((c=poptGetNextOpt(context)) >= 0){
        printf("%c\n", c);   
        if (optarg) {
            printf("%s\n", optarg);   
        }
    }

    return 0;
}
  • 编译
gcc -o jiangxq main.c -lpopt
  • 执行结果
[root@localhost popt]# ./jiangxq -A -t aaaa
A
t
aaaa

使用popt自带的参数/选项说明

#include <stdio.h>
#include <unistd.h>
#include <popt.h>

int
main(int argc, char **argv)
{
    poptContext context;
    int c;
    char *optarg = NULL;
    struct poptOption options_table[] = {
        { "add-service", 'A', POPT_ARG_NONE, NULL, 'A', "opt usage for A", "no param" },
        { "tcp-service", 't', POPT_ARG_STRING, &optarg, 't', "opt usage for t", "param is string" },
        POPT_AUTOHELP
        { NULL, 0, 0, NULL, 0}

    };
    context = poptGetContext("jiangxq", argc, (const char **)argv,
				 options_table, 0);

    while ((c=poptGetNextOpt(context)) >= 0){
        printf("%c\n", c);   
        if (optarg) {
            printf("%s\n", optarg);   
        }
    }

    return 0;
}
  • 执行结果
[root@localhost popt]# ./jiangxq --help
Usage: jiangxq [OPTION...]
  -A, --add-service                     opt usage for A
  -t, --tcp-service=param is string     opt usage for t

Help options:
  -?, --help                            Show this help message
  --usage                               Display brief usage message
  
[root@localhost popt]# ./jiangxq --usage
Usage: jiangxq [-A?] [-A|--add-service] [-t|--tcp-service param is string] [-?|--help] [--usage]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值