linux程序 option,long-option.c/解析命令行参数

#include //继续ing。。。

#include "version-etc.h"

//初始化结构体

static struct option const long_options[] =

{

{"help", no_argument, NULL, 'h'},

{"version", no_argument, NULL, 'v'},

{NULL, 0, NULL, 0}

};

这里贴一下从网上找到的中文解释(出自http://blog.chinaunix.net/u/12592/showart_429841.html):

struct options的定义如下:

struct option{

const char *name;

int has_arg;

int *flag;

int val;

};

对结构中的各元素解释如下:

const char *name

这是选项名,前面没有短横线。譬如"help"、"verbose"之类。

int has_arg

描述了选项是否有选项参数。如果有,是哪种类型的参数,此时,它的值一定是下表中的一个。

符号常量     数值     含义

no_argument     0     选项没有参数

required_argument     1     选项需要参数

optional_argument     2     选项参数可选

int *flag

如果这个指针为NULL,那么 getopt_long()返回该结构val字段中的数值。如果该指针不为NULL,getopt_long()会使得它所指向的变量中填入val字段中的数值,并且getopt_long()返回0。如果flag不是NULL,但未发现长选项,那么它所指向的变量的数值不变。

int val

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

/* Process long options --help and --version, but only if argc == 2.

Be careful not to gobble up `--'.  */

函数具体实现的地方:

void

parse_long_options (int argc,

char **argv,

const char *command_name,

const char *package,

const char *version,

void (*usage_func) (int),

/* const char *author1, ...*/ ...)

{

int c;//定义局部变量

int saved_opterr;

saved_opterr = opterr; 初始化saved_opterr

/* Don't print an error message for unrecognized options.  */

opterr = 0;

if (argc == 2 如果传入的整型形参argc等于2并且

&& (c = getopt_long (argc, argv, "+", long_options(这里的这个结构体就是文件开头初始化的那个结构体了), NULL)) != -1)c的值是通过getopt_long得到的值

{

switch (c)根据getopt_long获得的c的值,选择应该进入哪个代码段执行程序

{

case 'h':如果是字符h,则调用注册的usage_func函数,传给这个函数的形参是EXIT_SUCCESS

(*usage_func) (EXIT_SUCCESS);

case 'v':如果是字符v,则打印下面列示的作者和帮助等信息,并返回0

{

va_list authors;

va_start (authors, usage_func);

version_etc_va (stdout, command_name, package, version, authors);

exit (0);

}

default:如果是其他值,则跳出switch语句块

/* Don't process any other long-named options.  */

break;

}

}

/* Restore previous value.  */

opterr = saved_opterr;opterr这时候得到的值是程序开始执行时的值

/* Reset this to zero so that getopt internals get initialized from

the probably-new parameters when/if getopt is called later.  */

optind = 0;重新设置optind的值

}

这个解析函数早在第一个程序sync.c里面就见到了,当时没有太关注,今天粗略地看了看,日后再详细研究,关于命令行选项的问题,需要花时间专门看看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/525821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

预告:Intel、Hulu、阿里、京东、携程等大数据实战直播

前言:由CSDN主办的SDCC 2017之大数据技术实战线上峰会将在CSDN学院举行。作为SD系列技术峰会的一部分,本次线上峰会秉承干货实料(案例)的内容原则,将邀请圈内顶尖的布道师、技术专家和技术引领者,共话大数据…

Linux添加gcc软连接,linux静态库,动态库和硬链接,软连接

静态库1、命令gcc -c a.c b.c生成a.o和b.o;2、命令ar -r libname.a a.o b.o生成包含名为libname.a的静态库;3、命令gcc main.c libname.a可以在main中链接静态库libname.a。动态库(共享库)1、命令gcc -c a.…

微服务应用容器化场景中常见问题总结

简介:云原生技术栈是下一代应用转型的必然选择,它包含了微服务架构,DevOps和容器技术。对于微服务架构来说,应用是“第一公民”,他逐渐蚕食原来底层软件或者硬件的功能,例如服务注册与发现以及负载均衡&…

linux用date指令,Linux中date指令的使用

1. 只输入date就会显示年月日时间二.date的设置 使用 -s设置时间和日期的的命令1..date –s 11:32:342..date –s 20101232就会显示年月日,但这样会把时间清零3..date –s ‘2010-10-2 11:22:21’这样就会显示修改的信息4.. date –s “2010-10-2 11:22…

Swarm的进化和大规模应用

目前在容器编排领域,Kubernetes、Mesos以及Swarm呈现“三分天下”的格局,各自都有着不同的应用场景。短期内,很难看到“一统天下”的局面,本文,来自阿里云高级专家陈萌辉将带你了解阿里内部在推行容器化过程中的一些着…

linux可以用dos命令是什么意思,Linux系统常用命令与DOS命令的类似之处和本质区别各是什么?...

满意答案iedsa3641推荐于 2019.09.13采纳率:56% 等级:8已帮助:361人Linux是一个非常优秀的操作系统,与MS-WINDOWS相比具有可靠、稳定、速度快等优点,且拥有丰富的根据UNIX版本改进的强大功能。下面做一个…

从 0 到 300,Instagram 创始人 CTO 分享工程团队成长的经验

最初,Instagram 被 Facebook 收购时公司只有六个工程师,且都是全栈。本文Instagram 创始人兼 CTO Mike Krieger 分享了创业初期并在资源有限的情况下,人才招聘、技术专攻的实践经验,将时间、精力用在最有价值的地方。以下为译文&a…

深度揭秘Twitter的新一代流处理引擎Heron

流计算又称实时计算,是继以Map-Reduce为代表的批处理之后的又一重要计算模型。随着互联网业务的发展以及数据规模的持续扩大,传统的批处理计算难以有效地对数据进行快速低延迟处理并返回结果。由于数据几乎处于不断增长的状态中,及时处理计算…

linux生成图片快捷方式,在Deepin Linux系统下给AppImage格式软件创建快捷方式的方法...

这两天使用deepin的过程中,无意中发现了一个叫krita的程序,是一个图像处理软件,类似Photoshop,于是就下载krita-4.2.8-x86_64的这个版本。但是麻烦的就是他是一个AppImage格式,每次我打开的时候需要打开相应文件夹中的…

图数据库在CMDB领域的应用

【导语】在上期的图数据库介绍中,我们对什么是图数据库,以及图数据库所擅长的领域做了一个初步的介绍,也收到了众多的反馈和咨询,特别要求我们对图数据库在一些具体行业的应用能做一些深入介绍。为此,从本期文档开始&a…

北理在线作业答案c语言,北理工19春《面向对象程序设计》在线作业【标准答案】...

北理工《面向对象程序设计》在线作业-0003试卷总分:100 得分:0一、 单选题 (共 38 道试题,共 76 分)1.对虚函数的调用()A.一定使用动态联编B.必须使用动态联编C.一定使用静态联编D.不一定使用动态联编2.下列关于派生类的描述中,错误的是()。A.派生类继承了基类的…

从分布式到微服务,深挖Service Mesh

原文:Pattern: Service Mesh (作者/Phil Calado,翻译/雁惊寒,责编/魏伟 ) 摘要:在前一段时间,我们CSDN推出了《深度剖析Service Mesh服务网格新生代Istio》一…

c语言程序设计安徽区笔试部分,2021年安徽省二级C语言程序设计笔试样题-20210419093521.doc-原创力文档...

第1套 C语言程序设计笔试样题一 单项选取题(每题1分,共40分)1.某微型计算机型号规格标有PentiuШ600字样,其中PentiuШ是指 __C____A. 厂家名称 B. 机器名称 C. CPU型号 D. 显示屏名称2.当前微型机上普通使用光驱及光盘,它采用是__C____A. 超…

应用开发者必须了解的Kubernetes网络二三事

Kubernetes网络基本的部署调度单元:Pod Kubernetes中的基本管理单元并非是一个容器,而是一个叫做pod的东西。我们认为部署了一个或多个容器的环境是一个pod单元。通常情况下,它们代表了提供部分服务的单个功能端点。 举两个有效的pods单元为例…

c51编程语言基础习题,《单片机基础》练习题及答案

单片机基础(第3版)第1章计算机基础知识(一)填空题1.十进制数14对应的二进制数表示为(1110B),十六进制数表示为(0EH)。十进制数-100的补码为(9CH),100的补码为(64H)。2.在一个非零的无符号二进制整数的末尾加两个0后,形成一个新的无符号二进制…

高可用Docker容器云在58集团的实践

58私有云平台是58同城架构线基于容器技术为内部服务开发的一套业务实例管理平台,支持业务实例按需扩展,秒级伸缩,平台提供友好的用户交互过程,规范化的测试、上线流程,旨在将开发、测试人员从基础环境的配置与管理中解…

c语言程序设计课件数组,数组(C语言程序设计)课件

数组(C语言程序设计)课件 前牙反颌和开颌的原因多由于不良喂养方式和吮指等不良习惯造成,也可因多颗乳磨牙过早缺失,迫使儿童用前牙咀嚼,下颌逐渐前伸移位造成。 前牙反颌和开颌的原因多由于不良喂养方式和吮指等不良习惯造成,也可…

Docker CE/EE 原生支持Kubernetes

在今天的 DockerCon EU (2017) 上,Solomon 宣布 Docker 将原生支持 Kubernetes,也就是说 Kubernetes 将和 Swarm 一样作为 Docker 平台的编排管理系统。这包括 Docker EE、Docker CE 以及 Docker for Mac/Windows 等全平台的支持。 Docker for Mac/Windo…

c语言创建一个hello.txt文件,并检查是否成功,广东工业大学C语言验(上机)任务书2015版.doc...

广东工业大学C语言验(上机)任务书2015版广东工业大学实验(上机)任务书(2015 — 2016 学年度第 1 学期)课程名称 高级语言程序设计 课程设计 实验室名称及地点: 实验2号楼306指导教师: 孟安波、王星华 周次节次实验主要内容每组学生人数具体任务要求65-8熟…

网易云容器服务基于Kubernetes的实践探索

Kubernetes的特点 近年来Docker容器作为一种轻量级虚拟化技术革新了整个IT领域软件开发部署流程,如何高效自动管理容器和相关的计算、存储等资源,将容器技术真正落地上线,则需要一套强大容器编排服务,当前大红大紫的Kubernetes已经…