1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 命令行解析函数:getopt_long getopt

命令行解析函数:getopt_long getopt

时间:2023-01-10 08:50:42

相关推荐

命令行解析函数:getopt_long getopt

一、前言

在学习一些项目代码时,尤其涉及到命令行传参的代码,经常遇到getopt相关的函数,对这一类函数可以说是既陌生又熟悉。陌生是因为不知道它是干啥的,熟悉呢,是因为经常遇到。于是乎在追踪了多天ipsec配置文件解析流程之后,准备学习下这一类命令行解析利器。

这么多命令行参数,需要解析,想象都让人头大,如果再没有一个好的解析方式,那就雪上加霜了。辛亏有了一类命令行解析函数,可以让这些解析操作变得容易一点点。下面就简单的介绍下这一类函数,主要有getopt、getopt_long、getopt_long_only。

Man 手册信息如下:

NAMEgetopt, getopt_long, getopt_long_only, optarg, optind, opterr, optopt - Parse command-line optionsSYNOPSIS#include <unistd.h>int getopt(int argc, char * const argv[],const char *optstring);extern char *optarg;extern int optind, opterr, optopt;#include <getopt.h>int getopt_long(int argc, char * const argv[],const char *optstring,const struct option *longopts, int *longindex);int getopt_long_only(int argc, char * const argv[],const char *optstring,const struct option *longopts, int *longindex);

先从最简单的,最基本的getopt函数开始。然后再介绍增强版的getopt_long函数。

二、getopt函数

2.1函数简介:

各项参数解释如下:

对于optstring字符串格式做一个简单说明:

在此类函数中,需要几个重要的变量共同配合才能完成命令行参数解析工作:

2.2举例说明:

代码如下:

/*************************************************************************> File Name: getopt.c> Author: Toney> Mail: vip_13031075266@> Created Time: 01月30日 星期六 21时50分45秒************************************************************************/#include <stdio.h>#include <unistd.h>#include <getopt.h>void main(int argc, char **argv){int flags, opt;while((opt = getopt(argc, argv, "ab:c::")) != -1){switch(opt){case 'a':printf("Input %d parameter is -a=%s\n", optind, optarg);break;case 'b':printf("Input %d parameter is -b=%s\n", optind, optarg);break;case 'c':printf("Input %d parameter is -c=%s\n", optind, optarg);break;default:printf("Not match!!!");}}return ;}

三、getopt_long函数

3.1函数简介:

各项参数解释如下:

Struct option结构体:

其中has_arg类型取值有如下几种:

在此类函数中,需要几个重要的变量共同配合才能完成命令行参数解析工作:

3.2 ipsec项目中的一个例子:

先看看在openswan源码中,有关使用getopt_long解析命令行的一个例子(各位把住坐稳了):

static const struct option long_opts[] = {# define OOOPTION_OFFSET/* name, has_arg, flag, val */{ "help", no_argument, NULL, 'h' },{ "version", no_argument, NULL, 'v' },{ "optionsfrom", required_argument, NULL, '+' },{ "label", required_argument, NULL, 'l' },{ "ctlbase", required_argument, NULL, OPT_CTLBASE + OO },{ "name", required_argument, NULL, OPT_NAME + OO },{ "connalias", required_argument, NULL, OPT_CONNALIAS + OO },{ "keyid", required_argument, NULL, OPT_KEYID + OO },{ "addkey", no_argument, NULL, OPT_ADDKEY + OO },{ "pubkeyrsa", required_argument, NULL, OPT_PUBKEYRSA + OO },{ "myid", required_argument, NULL, OPT_MYID + OO },{ "route", no_argument, NULL, OPT_ROUTE + OO },{ "unroute", no_argument, NULL, OPT_UNROUTE + OO },{ "initiate", no_argument, NULL, OPT_INITIATE + OO },{ "terminate", no_argument, NULL, OPT_TERMINATE + OO },{ "delete", no_argument, NULL, OPT_DELETE + OO },{ "deletestate", required_argument, NULL, OPT_DELETESTATE + OO + NUMERIC_ARG },{ "crash", required_argument, NULL, OPT_DELETECRASH + OO },{ "listen", no_argument, NULL, OPT_LISTEN + OO },{ "unlisten", no_argument, NULL, OPT_UNLISTEN + OO },{ "purgeocsp", no_argument, NULL, OPT_PURGEOCSP + OO },{ "rereadsecrets", no_argument, NULL, OPT_REREADSECRETS + OO },{ "rereadcacerts", no_argument, NULL, OPT_REREADCACERTS + OO },{ "rereadaacerts", no_argument, NULL, OPT_REREADAACERTS + OO },{ "rereadocspcerts", no_argument, NULL, OPT_REREADOCSPCERTS + OO },{ "rereadacerts", no_argument, NULL, OPT_REREADACERTS + OO },{ "rereadcrls", no_argument, NULL, OPT_REREADCRLS + OO },{ "rereadall", no_argument, NULL, OPT_REREADALL + OO },{ "status", no_argument, NULL, OPT_STATUS + OO },{ "shutdown", no_argument, NULL, OPT_SHUTDOWN + OO },{ "xauthname", required_argument, NULL, OPT_XAUTHNAME + OO },{ "xauthuser", required_argument, NULL, OPT_XAUTHNAME + OO },{ "xauthpass", required_argument, NULL, OPT_XAUTHPASS + OO },{ "tpmeval", required_argument, NULL, OPT_TPMEVAL + OO },{ "oppohere", required_argument, NULL, OPT_OPPO_HERE + OO },{ "oppothere", required_argument, NULL, OPT_OPPO_THERE + OO },{ "asynchronous", no_argument, NULL, OPT_ASYNC + OO },/* list options */{ "utc", no_argument, NULL, LST_UTC + OO },{ "checkpubkeys", no_argument, NULL, LST_CHECKPUBKEYS + OO },{ "listpubkeys", no_argument, NULL, LST_PUBKEYS + OO },{ "listcerts", no_argument, NULL, LST_CERTS + OO },{ "listcacerts", no_argument, NULL, LST_CACERTS + OO },{ "listacerts", no_argument, NULL, LST_ACERTS + OO },{ "listaacerts", no_argument, NULL, LST_AACERTS + OO },{ "listocspcerts", no_argument, NULL, LST_OCSPCERTS + OO },{ "listgroups", no_argument, NULL, LST_GROUPS + OO },{ "listcrls", no_argument, NULL, LST_CRLS + OO },{ "listocsp", no_argument, NULL, LST_OCSP + OO },{ "listpsks", no_argument, NULL, LST_PSKS + OO },{ "listevents", no_argument, NULL, LST_EVENTS + OO },{ "listpairs",no_argument, NULL, LST_HOSTPAIRS + OO },{ "listhostpairs", no_argument, NULL, LST_HOSTPAIRS + OO },{ "listall", no_argument, NULL, LST_ALL + OO },/* options for an end description */{ "host", required_argument, NULL, END_HOST + OO },{ "id", required_argument, NULL, END_ID + OO },{ "cert", required_argument, NULL, END_CERT + OO },{ "ca", required_argument, NULL, END_CA + OO },{ "groups", required_argument, NULL, END_GROUPS + OO },{ "ikeport", required_argument, NULL, END_IKEPORT + OO + NUMERIC_ARG },{ "nexthop", required_argument, NULL, END_NEXTHOP + OO },{ "client", required_argument, NULL, END_CLIENT + OO },{ "clientwithin", required_argument, NULL, END_CLIENTWITHIN + OO },{ "clientprotoport", required_argument, NULL, END_CLIENTPROTOPORT + OO },{ "dnskeyondemand", no_argument, NULL, END_DNSKEYONDEMAND + OO },{ "srcip", required_argument, NULL, END_SRCIP + OO },{ "updown", required_argument, NULL, END_UPDOWN + OO },{ "tundev", required_argument, NULL, END_TUNDEV + OO + NUMERIC_ARG },/* options for a connection description */{ "to", no_argument, NULL, CD_TO + OO },{ "psk", no_argument, NULL, CD_PSK + OO },{ "rsasig", no_argument, NULL, CD_RSASIG + OO },{ "encrypt", no_argument, NULL, CD_ENCRYPT + OO },{ "authenticate", no_argument, NULL, CD_AUTHENTICATE + OO },{ "compress", no_argument, NULL, CD_COMPRESS + OO },{ "overlapip", no_argument, NULL, CD_OVERLAPIP + OO },{ "tunnel", no_argument, NULL, CD_TUNNEL + OO },{ "tunnelipv4", no_argument, NULL, CD_TUNNELIPV4 + OO },{ "tunnelipv6", no_argument, NULL, CD_TUNNELIPV6 + OO },{ "pfs", no_argument, NULL, CD_PFS + OO },{ "sha2_truncbug", no_argument, NULL, CD_SHA2_TRUNCBUG + OO },{ "aggrmode", no_argument, NULL, CD_AGGRESSIVE + OO },{ "disablearrivalcheck", no_argument, NULL, CD_DISABLEARRIVALCHECK + OO },{ "initiateontraffic", no_argument, NULL, CD_SHUNT0 + (POLICY_SHUNT_TRAP >> POLICY_SHUNT_SHIFT << AUX_SHIFT) + OO },{ "pass", no_argument, NULL, CD_SHUNT0 + (POLICY_SHUNT_PASS >> POLICY_SHUNT_SHIFT << AUX_SHIFT) + OO },{ "drop", no_argument, NULL, CD_SHUNT0 + (POLICY_SHUNT_DROP >> POLICY_SHUNT_SHIFT << AUX_SHIFT) + OO },{ "reject", no_argument, NULL, CD_SHUNT0 + (POLICY_SHUNT_REJECT >> POLICY_SHUNT_SHIFT << AUX_SHIFT) + OO },{ "failnone", no_argument, NULL, CD_FAIL0 + (POLICY_FAIL_NONE >> POLICY_FAIL_SHIFT << AUX_SHIFT) + OO },{ "failpass", no_argument, NULL, CD_FAIL0 + (POLICY_FAIL_PASS >> POLICY_FAIL_SHIFT << AUX_SHIFT) + OO },{ "faildrop", no_argument, NULL, CD_FAIL0 + (POLICY_FAIL_DROP >> POLICY_FAIL_SHIFT << AUX_SHIFT) + OO },{ "failreject", no_argument, NULL, CD_FAIL0 + (POLICY_FAIL_REJECT >> POLICY_FAIL_SHIFT << AUX_SHIFT) + OO },{ "dontrekey", no_argument, NULL, CD_DONT_REKEY + OO },{ "forceencaps", no_argument, NULL, CD_FORCEENCAPS + OO },{ "dpddelay", required_argument, NULL, CD_DPDDELAY + OO + NUMERIC_ARG },{ "dpdtimeout", required_argument, NULL, CD_DPDTIMEOUT + OO + NUMERIC_ARG },{ "dpdaction", required_argument, NULL, CD_DPDACTION + OO },#ifdef XAUTH{ "xauth", no_argument, NULL, END_XAUTHSERVER + OO },{ "xauthserver", no_argument, NULL, END_XAUTHSERVER + OO },{ "xauthclient", no_argument, NULL, END_XAUTHCLIENT + OO },#endif#ifdef MODECFG{ "modecfgpull", no_argument, NULL, CD_MODECFGPULL + OO },{ "modecfgserver", no_argument, NULL, END_MODECFGSERVER + OO },{ "modecfgclient", no_argument, NULL, END_MODECFGCLIENT + OO },#ifdef MODECFG_DNSWINS{ "modecfgdns1", required_argument, NULL, CD_MODECFGDNS1 + OO },{ "modecfgdns2", required_argument, NULL, CD_MODECFGDNS2 + OO },{ "modecfgwins1", required_argument, NULL, CD_MODECFGWINS1 + OO },{ "modecfgwins2", required_argument, NULL, CD_MODECFGWINS2 + OO },{ "modeconfigserver", no_argument, NULL, END_MODECFGSERVER + OO },{ "modeconfigclient", no_argument, NULL, END_MODECFGCLIENT + OO },#endif#endif{ "metric", required_argument, NULL, CD_METRIC + OO + NUMERIC_ARG },{ "mtu", required_argument, NULL, CD_CONNMTU + OO + NUMERIC_ARG },{ "sendcert", required_argument, NULL, END_SENDCERT + OO },{ "certtype", required_argument, NULL, END_CERTTYPE + OO + NUMERIC_ARG },{ "ipv4", no_argument, NULL, CD_CONNIPV4 + OO },{ "ipv6", no_argument, NULL, CD_CONNIPV6 + OO },{ "ikelifetime", required_argument, NULL, CD_IKELIFETIME + OO + NUMERIC_ARG },{ "ipseclifetime", required_argument, NULL, CD_IPSECLIFETIME + OO + NUMERIC_ARG },{ "rekeymargin", required_argument, NULL, CD_RKMARGIN + OO + NUMERIC_ARG },{ "rekeywindow", required_argument, NULL, CD_RKMARGIN + OO + NUMERIC_ARG },/* OBSOLETE */{ "rekeyfuzz", required_argument, NULL, CD_RKFUZZ + OO + NUMERIC_ARG },{ "keyingtries", required_argument, NULL, CD_KTRIES + OO + NUMERIC_ARG },{ "ike", required_argument, NULL, CD_IKE + OO },{ "ikealg", required_argument, NULL, CD_IKE + OO },{ "pfsgroup", required_argument, NULL, CD_PFSGROUP + OO },{ "esp", required_argument, NULL, CD_ESP + OO },{ "remote_peer_type", required_argument, NULL, CD_REMOTEPEERTYPE + OO},#ifdef HAVE_NM{ "nm_configured", no_argument, NULL, CD_NMCONFIGURED + OO},#endif#ifdef HAVE_LABELED_IPSEC{ "loopback", no_argument, NULL, CD_LOOPBACK + OO},{ "labeledipsec", no_argument, NULL, CD_LABELED_IPSEC + OO},{ "policylabel", required_argument, NULL, CD_POLICY_LABEL + OO },#endif#ifdef DEBUG{ "debug-none", no_argument, NULL, DBGOPT_NONE + OO },{ "debug-all", no_argument, NULL, DBGOPT_ALL + OO },{ "debug-raw", no_argument, NULL, DBGOPT_RAW + OO },{ "debug-crypt", no_argument, NULL, DBGOPT_CRYPT + OO },{ "debug-parsing", no_argument, NULL, DBGOPT_PARSING + OO },{ "debug-emitting", no_argument, NULL, DBGOPT_EMITTING + OO },{ "debug-control", no_argument, NULL, DBGOPT_CONTROL + OO },{ "debug-lifecycle", no_argument, NULL, DBGOPT_LIFECYCLE + OO },{ "debug-klips", no_argument, NULL, DBGOPT_KLIPS + OO },{ "debug-netkey", no_argument, NULL, DBGOPT_KLIPS + OO },{ "debug-xfrm", no_argument, NULL, DBGOPT_KLIPS + OO },{ "debug-dns", no_argument, NULL, DBGOPT_DNS + OO },{ "debug-oppo", no_argument, NULL, DBGOPT_OPPO + OO },{ "debug-oppoinfo", no_argument, NULL, DBGOPT_OPPOINFO + OO },{ "debug-whackwatch", no_argument, NULL, DBGOPT_WHACKWATCH + OO },{ "debug-controlmore", no_argument, NULL, DBGOPT_CONTROLMORE + OO },{ "debug-pfkey", no_argument, NULL, DBGOPT_PFKEY + OO },{ "debug-nattraversal", no_argument, NULL, DBGOPT_NATT + OO },{ "debug-natt", no_argument, NULL, DBGOPT_NATT + OO },{ "debug-nat_t", no_argument, NULL, DBGOPT_NATT + OO },{ "debug-nat-t", no_argument, NULL, DBGOPT_NATT + OO },{ "debug-x509", no_argument, NULL, DBGOPT_X509 + OO },{ "debug-dpd",no_argument, NULL, DBGOPT_DPD + OO },{ "debug-private", no_argument, NULL, DBGOPT_PRIVATE + OO },{ "impair-delay-adns-key-answer", no_argument, NULL, DBGOPT_IMPAIR_DELAY_ADNS_KEY_ANSWER + OO },{ "impair-delay-adns-txt-answer", no_argument, NULL, DBGOPT_IMPAIR_DELAY_ADNS_TXT_ANSWER + OO },{ "impair-bust-mi2", no_argument, NULL, DBGOPT_IMPAIR_BUST_MI2 + OO },{ "impair-bust-mr2", no_argument, NULL, DBGOPT_IMPAIR_BUST_MR2 + OO },{ "impair-sa-fail", no_argument, NULL, DBGOPT_IMPAIR_SA_CREATION + OO },{ "impair-die-oninfo", no_argument, NULL, DBGOPT_IMPAIR_DIE_ONINFO + OO },{ "impair-jacob-two-two", no_argument, NULL, DBGOPT_IMPAIR_JACOB_TWO_TWO + OO },{ "impair-major-version-bump", no_argument, NULL, DBGOPT_IMPAIR_MAJOR_VERSION_BUMP + OO },{ "impair-minor-version-bump", no_argument, NULL, DBGOPT_IMPAIR_MINOR_VERSION_BUMP + OO },{ "impair-retransmits", no_argument, NULL, DBGOPT_IMPAIR_RETRANSMITS + OO },{ "impair-send-bogus-isakmp-flag", no_argument, NULL, DBGOPT_IMPAIR_SEND_BOGUS_ISAKMP_FLAG + OO },{ "whackrecord",required_argument, NULL, OPT_WHACKRECORD + OO},{ "whackstoprecord", no_argument, NULL, OPT_WHACKSTOPRECORD + OO},#endif# undef OO{ 0,0,0,0 }};

这是whack命令解析时的一个结构信息,可以想象它的配置命令是有多少,而具体实现差不多800行左右的C代码。这里需要注意的是:struct option结构中的val取值通常是单个字符或者数字。由于单字符数量有限,参数比较少时可以使用字符,但是如果像上面辣么多参数,通常采用枚举类型,方便扩展。

四、getopt_long_only函数

getopt_long_only 函数与 getopt_long 函数使用相同的参数表,在功能上基本一致,只是 getopt_long 只将 --name 当作长参数,但 getopt_long_only 会将 --name 和 -name 两种选项都当作长参数来匹配。getopt_long_only 如果选项 -name 不能在 longopts 中匹配,但能匹配一个短选项,它就会解析为短选项。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。