记一次函数异常(getopt_long)
前言
以下参考博客以及man手册。
getopt_long函数,getopt_long函数包含了getopt函数的功能,并且还可以指定“长参数”(或者说长选项),与getopt函数对比,getopt_long比其多了两个参数:
int getopt(int argc, char * const argv[], const char *optstring);
int getopt_long(int argc, char * const argv[], const char *optstring,
const struct option *longopts, int *longindex);
在这里,longopts指向的是一个由option结构体组成的数组(数组最后一个成员必须是全0),那个数组的每个元素,指明了一个“长参数”(即形如–name的参数)名称和性质:
struct option {
const char *name;
int has_arg;
int *flag;
int val;
};
name 是参数的名称
has_arg 指明是否带参数值,其数值可选:
no_argument (即 0) 表明这个长参数不带参数(即不带数值,如:–name)
required_argument (即 1) 表明这个长参数必须带参数(即必须带数值,如:–name Bob)
optional_argument(即2)表明这个长参数后面带的参数是可选的,(即–name和–name Bob均可)
flag 当这个指针为空的时候,函数直接将val的数值从getopt_long的返回值返回出去,当它非空时,val的值会被赋到flag指向的整型数中,而函数返回值为0
val 用于指定函数找到该选项时的返回值,或者当flag非空时指定flag指向的数据的值。
参数longindex,如果longindex非空,它指向的变量将记录当前找到参数符合longopts里的第几个元素的描述,即是longopts的下标值。
一个小case
// #pragma pack(push, 1)
#include "unistd.h"
#include "getopt.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
void ParserArgs(int argc, char **argv) {
int opt = 0;
int longIdx = 0;
const char *optStr = "h";
static struct option long_options[] = {
{"proto", required_argument, NULL, 201},
{0, 0, 0, 0},
};
if (argv[argc-1][0] == '&') {
argc -= 1;
}
while ( (opt = getopt_long(argc, argv, optStr, long_options, &longIdx)) != -1) {
switch (opt) {
case 201:
printf("get %s\n", optarg);
break;
case 'h':
case '?':
printf("aaaa using '-h' to get help");
exit(0);
default:
printf("using '-h' to get help");
exit(0);
}
}
}
int main(int argc, char ** argv) {
ParserArgs(argc, argv);
return 0;
}
看到上面 #pragma pack(push, 1) 没有,如果把这个注掉,运行完美。
但是如果打开就会有段错误。
- 谁会把对齐写在这?
- 我觉得这种情况是很有可能发生的。可能你不会写的这么直接,像这个例子一样。但是你可能包含了一个没有闭合对齐的头文件,它产生的结果和这是一样的。
- 需要检查“pragma pack(push, n)”,“pragma pack(pop)”;“pragma pack(n)”,"pragma pack()"是否匹配。
- 为什么不闭合对齐会有问题?
- 我觉得和getopt_long本身有关,其中option参数是个结构指针,对齐会影响函数对参数的解析。
记一次函数异常(getopt_long)的更多相关文章
- 第四记 Java异常
Java异常结构图 Java所有异常都是从Throwable继承而来,Throwable有两个子类,Error与Exception. Error是错误,对于所有的编译时期的错误以及系统错误都是通过Er ...
- AJPFX关于异常和file类的总结
/** * 各位坛友注意啦!对我这个帖子有任何的疑惑的,可以尽管留帖提问,我会在看到的第一时间回贴,既然写得出这帖子,* 就要对看这帖子的人负责,所以有问题,尽管问!* * * 这块没学好的同学,可以 ...
- Oracle 数据库日常巡检
1. 检查数据库基本状况 包含:检查Oracle实例状态,检查Oracle服务进程,检查Oracle监听进程,共三个部分. 1.1. 检查Oracle实例状态 select instance_name ...
- [操作系统实验lab4]实验报告
实验概况 在开始实验之前,先对实验整体有个大概的了解,这样能让我们更好地进行实验. 我们本次实验需要补充的内容包括一整套以sys开头的系统调用函数,其中包括了进程间通信需要的一些系统调用如sys_ip ...
- springmvc学习笔记--REST API的异常处理
前言: 最近使用springmvc写了不少rest api, 觉得真是一个好框架. 之前描述的几篇关于rest api的文章, 其实还是不够完善. 比如当遇到参数缺失, 类型不匹配的情况时, 直接抛出 ...
- oracle 10g操作和维护手册
1. 检查数据库基本状况... 1.1. 检查Oracle实例状态... 1.2. 检查Oracle服务进程... 1.3. 检查Oracle监听状态... 2. ...
- 朱晔的互联网架构实践心得S1E4:简单好用的监控六兄弟
朱晔的互联网架构实践心得S1E4:简单好用的监控六兄弟 [下载本文PDF进行阅读] 这里所说的六兄弟只指ELK套件(ElasticSearch+Logstash+Kibana)以及TIG套件(Tele ...
- oracle 日常巡检
1. 检查数据库基本状况 包含:检查Oracle实例状态,检查Oracle服务进程,检查Oracle监听进程,共三个部分. 1.1. 检查Oracle实例状态 select instance_name ...
- 记一次关闭Hadoop时no namenode to stop异常
记一次关闭Hadoop时no namenode to stop异常 在自己的虚拟机环境上跑着hadoop集群,一直正常运行着,不用的时候直接挂起虚拟机,今天需要做些调整,但是发现集群突然无法正常关 ...
随机推荐
- Mybatis 中判断参数长度
<if test="params.length()!=2">
- 计算机网络-传输层(1)UDP协议
UDP协议基于Internet IP协议,只提供两个基础功能: 分用/复用 分用:主机接收到IP数据报(datagram),每个数据报携带源IP地址.目的IP地址且携带一个传输层的段(Segment) ...
- shell 三剑客之 grep
grep 的全称是 Globally search a Regular Expression and Print,是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹 ...
- 区块链入门到实战(23)之以太坊(Ethereum) – 虚拟机架构
以太坊(Ethereum)网络中,定义了一组通用协议用于支持智能合约的运行,其核心便是以太坊(Ethereum)虚拟机. 下图解释了该架构: 开发人员使用Solidity等开发语言开发智能合约 源程序 ...
- Java高级特性——反射机制(第二篇)
在Java高级特性——反射机制(第一篇)中,写了很多反射的实例,可能对于Class的了解还是有点迷糊,那么我们试着从内存角度去分析一下. Java内存 从上图可以看出,Java将内存分为堆.栈.方法区 ...
- 网站会不会因为同IP网站被K而受到惩罚
http://www.wocaoseo.com/thread-289-1-1.html 使用虚拟主机的网站会不会因为同一个IP或同一台服务器上有其他网站作弊被处罚而受连累,也被惩罚? 复制代码 百度官 ...
- 分享一个登录页面(前端框架layui)-20200318
效果图 对该页面的总结: 1.前端框架layui layui官网:https://www.layui.com/,下载之后,简单配置就可使用 2.layui模块引用与使用的方式 <script&g ...
- ssm框架之异常处理
异常处理思路 系统中异常包括两类:预期异常和运行时异常runtimeexception,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手段减少运行时异常的发生. 系统的dao.s ...
- WebApi之DOM的基本介绍
1.1.1 什么是DOM 文档对象模型(Document Object Model,简称DOM),是 W3C 组织推荐的处理可扩展标记语言(html或者xhtml)的标准编程接口. W3C 已 ...
- 力扣Leetcode 1248. 统计「优美子数组」
统计「优美子数组」 给你一个整数数组 nums 和一个整数 k. 如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」. 请返回这个数组中「优美子数组」的数目. 示例 ...