前言

以下参考博客以及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)的更多相关文章

  1. 第四记 Java异常

    Java异常结构图 Java所有异常都是从Throwable继承而来,Throwable有两个子类,Error与Exception. Error是错误,对于所有的编译时期的错误以及系统错误都是通过Er ...

  2. AJPFX关于异常和file类的总结

    /** * 各位坛友注意啦!对我这个帖子有任何的疑惑的,可以尽管留帖提问,我会在看到的第一时间回贴,既然写得出这帖子,* 就要对看这帖子的人负责,所以有问题,尽管问!* * * 这块没学好的同学,可以 ...

  3. Oracle 数据库日常巡检

    1. 检查数据库基本状况 包含:检查Oracle实例状态,检查Oracle服务进程,检查Oracle监听进程,共三个部分. 1.1. 检查Oracle实例状态 select instance_name ...

  4. [操作系统实验lab4]实验报告

    实验概况 在开始实验之前,先对实验整体有个大概的了解,这样能让我们更好地进行实验. 我们本次实验需要补充的内容包括一整套以sys开头的系统调用函数,其中包括了进程间通信需要的一些系统调用如sys_ip ...

  5. springmvc学习笔记--REST API的异常处理

    前言: 最近使用springmvc写了不少rest api, 觉得真是一个好框架. 之前描述的几篇关于rest api的文章, 其实还是不够完善. 比如当遇到参数缺失, 类型不匹配的情况时, 直接抛出 ...

  6. oracle 10g操作和维护手册

    1.    检查数据库基本状况... 1.1.     检查Oracle实例状态... 1.2.     检查Oracle服务进程... 1.3.     检查Oracle监听状态... 2.    ...

  7. 朱晔的互联网架构实践心得S1E4:简单好用的监控六兄弟

    朱晔的互联网架构实践心得S1E4:简单好用的监控六兄弟 [下载本文PDF进行阅读] 这里所说的六兄弟只指ELK套件(ElasticSearch+Logstash+Kibana)以及TIG套件(Tele ...

  8. oracle 日常巡检

    1. 检查数据库基本状况 包含:检查Oracle实例状态,检查Oracle服务进程,检查Oracle监听进程,共三个部分. 1.1. 检查Oracle实例状态 select instance_name ...

  9. 记一次关闭Hadoop时no namenode to stop异常

    记一次关闭Hadoop时no namenode to stop异常 ​ 在自己的虚拟机环境上跑着hadoop集群,一直正常运行着,不用的时候直接挂起虚拟机,今天需要做些调整,但是发现集群突然无法正常关 ...

随机推荐

  1. flask-migrate 处理sqlite数据库报错Constraint must have a name 的解决方案

    环境:flask+python+sqlite,我想给某个表里某个字段加unique属性 执行 python manage.py db migrate 没报错,执行 python manage.py d ...

  2. 设计模式:原型模式介绍 && 原型模式的深拷贝问题

    0.背景 克隆羊问题:有一个羊,是一个类,有对应的属性,要求创建完全一样的10只羊出来. 那么实现起来很简单,我们先写出羊的类: public class Sheep { private String ...

  3. Goland 生成可执行文件

    Goland通过调用go build 生成可执行文件. 默认Goland是可以执行程序,但你找不到可执行文件. 你需要自定义配置文件. 创建go build配置文件 Run kind 选Directo ...

  4. Spring Boot 教程 - 文件上传下载

    在日常的开发工作中,基本上每个项目都会有各种文件的上传和下载,大多数文件都是excel文件,操作excel的JavaAPI我用的是apache的POI进行操作的,POI我之后会专门讲到.此次我们不讲如 ...

  5. 关于Differentiated Services Field (DS Field)的诸多疑问

    Differentiated Services Field (DS Field) 先上疑问截图: 这是用wireshark抓包时协议树的某一项的展开结果:IPV4 header.其中有一项如下: 大家 ...

  6. Springboot + Rabbitmq + WebSocet + vue

    1.pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ...

  7. python基础 Day12

    python Day12 生成器python社区,生成器与迭代器看成一种.生成器的本质就是迭代器. 区别:生成器是我们自己用python代码构建的数据结构.迭代器都是提供的,或者转化得来的. 获取生成 ...

  8. 自己搭建的集群,启动hadoop时slave节点的datanode没有启起来怎么办?

    自己搭建的集群,启动hadoop 集群是,发现slave节点的datanode没有启动,查了资料发现是因为我在启动集群前,执行了这个命令: hadoop namenode -format 这个指令会重 ...

  9. Java--- 关于null的处理若干方法

    Java--- 关于null的处理若干方法 相信空指针是平时最常见的错误了,下面认识 null ,有助于解决 NPE 问题. nulll大小写敏感 关于这个问题,其实是对面试时候手写算法题时候需要注意 ...

  10. Angular 学习思路

    近些年前端框架非常多,主流的有 Vue.React.Angular 等.我参与的项目中使用较多的是 Vue.因为 Vue 学习难度不大,上手很快,代码简洁,而且使用 Vue 全家桶(Vue + Vue ...