概述
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]