linux getopt_long函数,新手疑问:getopt_long()重入问题

博主在开发命令行处理工具时遇到一个问题,使用getopt_long()处理多选项输入时,命令执行出现周期性错误。首次执行成功,随后的执行会交替失败,错误提示为未识别的选项'--09'。博主怀疑可能是全局变量未初始化导致,尝试过清理某些变量但未解决。其他开发者提出可能不是getopt_long函数本身的bug,而是程序其他部分的问题,如全局变量或越界操作。讨论中提供了可能的修正代码片段。
摘要由CSDN通过智能技术生成

大家好。

我在开发一个命令行处理工具,其中使用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处理;

...

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值