大家好。

我在开发一个命令行处理工具,其中使用getopt_long()函数来处理用户的多选项输入,但是发现如果输入一条命令比较长的时候,第一次可以执行成功,但是第二次就不能执行成功,第三次可以成功,第四次又不能,这样循环往复。具体现象如下:

> lanconfig --lan_ipaddr 192.168.10.209 (用户输入的命令)

done!  (这是执行成功后我自己的调试信息)

> lanconfig --lan_ipaddr 192.168.10.209  (再执行一遍同样的命令)

lanconfig: unrecognized option '--09'  (这一行是getopt_long()输出的错误信息)

我不明白为什么该函数在第二次调用时,居然找到一个"--09"的选项。我怀疑是我用了某个全局变量但是没有重新初始化导致的,后来在社区找到一个05年的帖,有类似的问题,这位大侠是用下面的语句清理了几个变量:

__getopt_initialized = 0;  //如果是1的话是不会获取optstring

last_nonopt = 1;   //后一个参数把他重置回第一个

first_nonopt = 1;   //前一个参数把他重置回第一个

optind = 1;   //初始argv[],可以为0,不过程序是不读取argv[0]

但是除了最后的optind是全局变量之外,其他三个参数都是getopt.c内部的静态变量,外部引用都会报“引用了没有定义的变量”错误,而我自己的程序中在调用前的确是将optind重置为1了。

开发的系统环境是Fadora 7,GCC版本是3.4.6,程序的主流程如下:

int main()

{

while(1)

{

等待用户输入命令;

分析输入命令到argc,argv变量中;

optind = 1;

result = getopt_long(argc, argv, ...);

根据result处理;

}

}

程序对照一些范例做过自检,流程上没有问题,因为在命令不太长的时候可以正确执行,并且optstring、option结构都没有错。

希望各位能给我一些指点或者建议,谢谢大家。

|

看了下你的现象。感觉不是getopt_long函数的问题。因为现象太过明显,如果是getopt_long函数的bug的话,早就报出来解决掉了。

是否你使用了过多的全局变量,或者有越界操作?或者,是否你的变量有需要初始化,但是你没做?

等下我做个例子,把lanconfig --lan_ipaddr 192.168.10.209  解析一下。稍等。大概半小时。

|

好像不能这么用getopt_long吧。

从来就没有想过可以这么使用getopt_long

|

没注意过,明天试一下

|

帮顶

|

应该是这么写吧

int c;

...

while ((c = getopt(argc, argv, ":af:hv")) != -1) {

根据result处理;

...

}

linux getopt_long函数,新手疑问:getopt_long()重入问题相关推荐

  1. 递归重入c语言延时函数多任务程序设计中的函数重入问题按照Keil的规范对函数添加关键字“reentrant”,将函数定义为可重入的 void Delay_MS(x) reentrant

    c语言延时函数_子牙篇(2)多任务程序设计中的函数重入问题 weixin_39559333 2020-11-29 09:07:44  39  收藏 文章标签: c语言延时函数 c语言延时函数delay ...

  2. C语言linux getopt_long()函数(命令行解析)(getopt、getopt_long_only)(短选项 -,长选项 --)(option结构体)(optind、optarg变量)

    参考文章:浅谈linux的命令行解析参数之getopt_long函数 文章目录 前言 一.关于命令行参数 二.getopt_long函数 参数以及返回值介绍(以上三个函数都适用): 1.argc和ar ...

  3. 【Linux系统编程】可重入和不可重入函数

    00. 目录 文章目录 00. 目录 01. 不可重入函数 02. 可重入函数 03. 判断条件 04. Linux常用可重入函数 05. 附录 01. 不可重入函数 在实时系统的设计中,经常会出现多 ...

  4. 【Linux系统编程】可重入函数和不可重入函数

    在实时系统的设计中,经常会出现多个任务调用同一个函数的情况.如果有一个函数不幸被设计成为这样:那么不同任务调用这个函数时可能修改其他任务调用这个函数的数据,从而导致不可预料的后果.这样的函数是不安全的 ...

  5. Linux信号编程实践(二) 信号发送函数和可重入函数

    在早期的UNIX中信号是不可靠的,不可靠在这里指的是:信号可能丢失,一个信号发生了,但进程却可能一直不知道这一点. 现在Linux 在SIGRTMIN实时信号之前的都叫不可靠信号,这里的不可靠主要是不 ...

  6. 浅谈linux的命令行解析参数之getopt_long函数

    前言 在linux中,经常需要各种命令,通常情况下都会带各种参数,而这些参数是如何解析的呢?通常使用GNU C提供的函数getopt.getopt_long.getopt_long_only函数来解析 ...

  7. Linux中的可重入函数和不可重入函数

    可重入函数 可重入函数(即可以被中断的函数)可以被一个以上的任务调用,而不担心数据破坏.可重入函数在任何时候都可以被中断,而一段时间之后又可以恢复运行,而相应的数据不会破坏或者丢失. 可重入函数使用的 ...

  8. [Linux]线程安全和可重入函数

    线程安全:一个函数被称为线程安全的,当且仅当被多个并发进程反复调用时,它会一直产生正确的结果.如果一个函数不是线程安全的,我们就说它是线程不安全的. 重入:函数被不同的控制流程调用,有可能在第一次调用 ...

  9. Linux系统编程---8(全局变量异步I/O,可重入函数)

    全局变量异步 I/O 分析如下父子进程交替 数数 程序.当捕捉函数里面的 sleep 取消,程序即会出现问题.请分析原因. #include<stdio.h> #include<si ...

  10. Linux | 可重入函数 | volatile | SIGCHLD信号

    文章目录 可重入函数 可重入与线程安全 volatile volatile和const同时修饰变量 SIGCHLD信号 可重入函数 当一个函数可以被两个执行流调用,我们称该函数具有重入特征 如果一个函 ...

最新文章

  1. WR:微生物污染源解析中宿主特异性标记物在中国的表现特征
  2. 清华发布《人工智能AI芯片研究报告》,一文读懂人才技术趋势
  3. Springboot集成websocket实例
  4. vue后端框架mysql_springboot + vue 前后端结合·数据库查询
  5. REST风格笔记【简介篇】
  6. 【Python基础入门系列】第09天:Python tuple
  7. 在实际应用中,用计算机作为控制器时,最大的优越性是( ),在实际应用中,用计算机作为控制器时,最大的优越性是( )。...
  8. Eclipse搭建springboot项目(六)全局异常
  9. FTP连接报530错误(FTP Error: 530 User cannot log in, home directory inaccessible)
  10. Linux服务器安全配置三要点
  11. python查找文字在图片中的位置_python实现简单图片文字识别翻译OCR
  12. 计算机软件水平考试中级题目,计算机软考中级考试试题及答案
  13. Pug/jade快速上手教程
  14. 科学计算机壁纸,科幻题材电脑插画桌面壁纸
  15. 华为手机克隆在哪个文件夹_华为手机克隆软件怎么使用?手机克隆APP操作步骤以及下载地址详细介绍[多图]...
  16. Ink脚本语言学习笔记(二)
  17. MOOS-ivp 实验一 MOOS软件的安装与执行
  18. 作业一:数据软件系统的介绍及spss的操作简介
  19. Linux中的ko怎么玩?
  20. excel之高级筛选与VLOOKUP函数

热门文章

  1. 【中文分词】结构化感知器SP
  2. Swift 个人学习笔记 - 01: A Swift Tour
  3. ruby gem 记录
  4. 创建一个地震Viewer
  5. 北京地铁5号线地图(线路图、站名、实拍pp)
  6. 在IE浏览器中url传参长度问题
  7. 2-17 numpy模块使用
  8. 重构:利用postman检测前后端互相传值
  9. SSL-ZYC 2416 条形图
  10. 请假时碰到法定假期,实际请假几天?