Linux命令选项及参数解析 getopt() getopt_long() 函数

news/2024/7/24 8:04:37 标签: 操作系统

假如程序命令行启动时,需要指定一系列参数,那么,getopt()与getopt_long()是你的不二选择。

作为曾经还在手写的孩纸,我发现这个之后,泪流满面。。

 

1. int getopt(int argc, char * const argv[], const char *optstring)

若选项在optstring中,返回选项字符,否则返回-1;与该选项对应的参数保存在变量optarg中

包含在unistd.h,argc和argv与main(int argc, char *argv[])的参数相对应,

optstring是选项字符集,表现为在启动命令行中'-'后面的首个字符,例如:ls -l -a, 'a'和'l'即在optstring中。

optstring的格式规范如下:

1) 单个字符为参数选项

2) 选项字符后面跟':',表示该选项必须具备参数,参数与选项之间以空格分隔,例如:start -f flile

3) 选项字符后面跟'::', 表示该选项必须具备参数,参数紧跟选项,二者连接在一起,此为GNU的扩充,例如:start -ffile

 

2. int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);

若选项在optstring中,返回选项字符,否则返回-1;与该选项对应的参数保存在变量optarg中

包含在getopt.h中,getopt_long()可以看成是支持长选项的getopt(),argc和argv与main(int argc, char *argv[])的参数相对应,

长选项是以"--"开头的,举个例子:"-h"与"--help"

20世纪90年代,Unix应用程序开始支持长选项,Linux是类Unix系统,因此兼容长选项

getopt_long()的前3个参数与getopt()相同,第4个参数是指向option结构的数组,option结构被称为“长选项表”。longindex参数如果没有设置为NULL,那么它就指向一个变量,这个变量会被赋值为寻找到的长选项在longopts中的索引值,这可以用于错误诊断。

option结构在getopt.h中的声明如下:
struct option {
  const char *name;
  int has_args;
  int *flag;
  int val;
}; 

name:选项字符串

has_args:三种参数类型,no_argument表示无参数(0),required_argument表示需要参数(1),optional_argument表示参数可选(2)

flag:如果为NULL,getopt_long()返回该结构val字段中的数值;如果不为NULL,getopt_long()会使得它所指向的变量中填入val字段中的数值,并且getopt_long()返回0;通常flag设置为NULL,val设置为与该长选项对应的短选项

val:发现了长选项时的返回值,或者flag不是NULL时载入*flag中的值。典型情况下,若flag不是NULL,那么val是个真/假值,譬如1 或0;另一方面,如果flag是NULL,那么val通常是字符常量,若长选项与短选项一致,那么该字符常量应该与optstring中出现的这个选项的参数相同。

 

以下是个示例:

 1 #include <unistd.h>
2 #include <getopt.h>
3
4 struct option opts[] = {
5 {"config", required_argument, NULL, 'f'},
6 {"help", no_argument, NULL, 'h'},
7 {"version", no_argument, NULL, 'v'}
8 };
9
10 int32_t main(int32_t argc, char **argv) {
11 char *configfile = NULL;
12 int32_t opt = 0;
13 //while ((opt = getopt(argc, argv, "f:hv")) != -1) {
14 while ((opt = getopt_long(argc, argv, "f:hv", opts, NULL)) != -1) {
15 switch (opt) {
16 case 'f':
17 configfile = strdup(optarg);
18 break;
19 case 'h':
20 LOG1("Usage: ./chatserver -hv | [-f configure_file]");
21 LOG1(" -f --config configure file");
22 LOG1(" -h --help help information");
23 LOG1(" -v --version help information");
24 return 0;
25 case 'v':
26 LOG1("version 1.0.0");
27 return 0;
28 default:
29 LOG1("Usage: ./chatserver -hv | [-f configure_file]");
30 LOG1(" -f --config configure file");
31 LOG1(" -h --help help information");
32 LOG1(" -v --version help information");
33 return -1;
34 }
35 }
36 return 0;
37 }



 

 

 

 

 

转载于:https://www.cnblogs.com/caosiyang/archive/2012/03/26/2417689.html


http://www.niftyadmin.cn/n/1707824.html

相关文章

eager_EAGER提取是一​​种代码异味

eager介绍 Hibernate获取策略确实可以使几乎没有爬网的应用程序和响应速度很快的应用程序有所不同。 在这篇文章中&#xff0c;我将解释为什么您应该更喜欢基于查询的获取而不是全局获取计划。 取得101 Hibernate定义了四种关联检索策略&#xff1a; 提取策略 描述加入原始SELE…

钉钉+百数私有云,助力企业数据中台搭建

数据中台的搭建&#xff0c;成为了近些年企业数字化转型的重要举措。尤其对于传统大型集团、企业来说&#xff0c;经过长期发展&#xff0c;往往拥有多个产业方向&#xff0c;项目众多管理复杂。除了配置例如钉钉这样的协同办公平台&#xff0c;拥有企业独立的数据中心&#xf…

远程连接数据库---Host * is not allowed to connect to this MySQL server

use mysql; update user set host % where user root; FLUSH RIVILEGES 发现第三步报错,选择重启服务,成功连接!

jaxb_JAXB众所周知的秘密

jaxb介绍 我重新发现了Java为大众提供的库。 当我第一次阅读该规范时&#xff0c;我很困惑&#xff0c;以为我需要所有这些特殊工具来实现。 我最近发现&#xff0c;只需要一些注释和一个POJO。 杰克斯 JAXB代表用于XML绑定的Java体系结构。 这种体系结构允许开发人员将来自类的…

多线程面试题_Java中的线程本地存储

多线程面试题开发人员中鲜为人知的功能之一是线程本地存储。 这个想法很简单&#xff0c;需要它的场景是……我们需要的数据在线程中很好。 如果我们有两个线程&#xff0c;则它们引用相同的全局变量&#xff0c;但我们希望它们具有彼此独立初始化的单独值。大多数主要的编程语…

百数私有云平台助力电商领域企业整体业务上云

我国近年来的电子商务交易额增长率一直保持快速增长势头&#xff0c;特别是网络零售市场更是发展迅速。从“双十一”、“618”到现在数不尽的电商节&#xff0c;业务发展迅猛的同时&#xff0c;商家们也需要处理越来越多的订单数据。如何选择一款配合高效的订单管理系统&#x…

IDEA--连接远程windows服务器

1.服务器tomcat配置 Tomcat下catalina.bat 添加下面代码 set CATALINA_OPTS-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port1099 -Dcom.sun.management.jmxremote.rmi.port1099 -Dcom.sun.management.jmxremote.sslfalse -Dcom.sun.management.jmxremot…

lambda表达式_您会后悔对Lambdas应用重载!

lambda表达式编写好的API很难。 非常辛苦。 如果您想让用户喜欢您的API&#xff0c;则必须考虑很多事情。 您必须在以下两者之间找到适当的平衡&#xff1a; 用处 易用性向后兼容向前兼容性 之前&#xff0c;在我们的文章&#xff1a; 如何设计良好的常规API中&#xff0c;我们…