当前位置: 技术问答>linux和unix
新手疑问:getopt_long()重入问题
来源: 互联网 发布时间:2016-05-12
本文导语: 大家好。 我在开发一个命令行处理工具,其中使用getopt_long()函数来处理用户的多选项输入,但是发现如果输入一条命令比较长的时候,第一次可以执行成功,但是第二次就不能执行成功,第三次可以成功,第...
大家好。
我在开发一个命令行处理工具,其中使用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()函数来处理用户的多选项输入,但是发现如果输入一条命令比较长的时候,第一次可以执行成功,但是第二次就不能执行成功,第三次可以成功,第四次又不能,这样循环往复。具体现象如下:
> 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 解析一下。稍等。大概半小时。
是否你使用了过多的全局变量,或者有越界操作?或者,是否你的变量有需要初始化,但是你没做?
等下我做个例子,把lanconfig --lan_ipaddr 192.168.10.209 解析一下。稍等。大概半小时。
|
好像不能这么用getopt_long吧。
从来就没有想过可以这么使用getopt_long
从来就没有想过可以这么使用getopt_long
|
没注意过,明天试一下
|
帮顶
|
应该是这么写吧
int c;
...
while ((c = getopt(argc, argv, ":af:hv")) != -1) {
根据result处理;
...
}
int c;
...
while ((c = getopt(argc, argv, ":af:hv")) != -1) {
根据result处理;
...
}