前言

以下参考博客以及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. 制作qq简易聊天框

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. 在 Go 语言中,我为什么使用接口

    强调一下是我个人的见解以及接口在 Go 语言中的意义. 如果您写代码已经有了一段时间,我可能不需要过多解释接口所带来的好处,但是在深入探讨 Go 语言中的接口前,我想花一两分钟先来简单介绍一下接口. ...

  3. Kubernetes实战总结 - 自定义Prometheus

    一.概述 首先Prometheus整体监控结构略微复杂,一个个部署并不简单.另外监控Kubernetes就需要访问内部数据,必定需要进行认证.鉴权.准入控制, 那么这一整套下来将变得难上加难,而且还需 ...

  4. Jmeter 常用函数(30)- 详解 __if

    如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.html 作用 判断给定条件是否成立 语法格式 ${_ ...

  5. C++ Templates (1.7 总结 Summary)

    返回完整目录 目录 1.7 总结 Summary 1.7 总结 Summary 函数模板定义了一系列不同模板实参的函数 当传递实参给依赖于模板参数的函数参数,函数模板推断模板参数并实例化相应的参数类型 ...

  6. .NET Core实用技巧(一)如何将EF Core生成的SQL语句显示在控制台中

    目录 .NET Core实用技巧(一)如何将EF Core生成的SQL语句显示在控制台中 前言 笔者最近在开发和维护一个.NET Core项目,其中使用几个非常有意思的.NET Core相关的扩展,在 ...

  7. Shell编程—gawk进阶

    1使用变量 awk编程语言支持两种不同类型的变量: 内建变量 自定义变量 1.1内建变量 1. 字段和记录分隔符变量 数据字段变量允许你使用美元符号($)和字段在该记录中的位置值来引用记录对应的字段. ...

  8. 从开源协议到谷歌禁用华为、Docker实体清单事件

    ​平时我们在日常开发生活都在大量和开源软件打着交道,例如安卓.Linux.Github.Docker等,而其中开源协议比如MIT.Apache也是耳熟能详,但是真正对开源协议的了解相信对大部分人来说都 ...

  9. 全国大学生信息安全竞赛初赛writeup

    本文首发于“合天智汇”公众号 作者:Fortheone WEB Babyunserialize 扫目录发现了 www.zip 下载下来发现似曾相识 之前wmctf2020的webweb出了f3的反序列 ...

  10. vue-cli3.0 vue脚手架3.0的使用

    1.安装vue-cli 3.0 npm install -g @vue/cli # or yarn globaladd @vue/cli 安装成功后查看版本:vue -V(大写的V)     2.命令 ...