【发布时间】:2016-04-20 21:01:30
【问题描述】:
这个问题很清楚,我想知道因为那个人说
getopt() 函数解析命令行参数。
我正在尝试将它与另一个与 main 具有相同签名的函数一起使用,并且 argc 和 argv 是通过 wordexp 获得的,所以一切看起来都一样,但是当调用 getopt 我得到一个分段调用 getopt_long 后立即出错。
#define OPT_HELP 'h'
#define OPTL_HELP "help"
#define OPT_MESS 'm'
#define OPTL_MESS "message"
#define OPT_STRING "hm:"
struct option longopts[] = {
{OPTL_HELP, no_argument, 0, OPT_HELP},
{OPTL_MESS, required_argument, 0, OPT_MESS},
{0, 0, 0, 0}
};
#define FLAG_MESS 1
void cmd_chat(int argc, char **argv)
{
int c, indexptr;
short flag = 0;
char message[481];
while ((c = getopt_long(argc, argv, OPT_STRING,
longopts, &indexptr)) != -1) {
debug(MAGENTA "cmd_chat", MAGENTA "c value: %d", c);
switch (c) {
case OPT_HELP:
debug(MAGENTA "cmd_chat", MAGENTA "calling help");
help(argv[0]);
return;
break;
case OPT_MESS:
flag |= FLAG_MESS;
strncpy(message, optarg, 481);
break;
default:
usage(argv[0]);
break;
}
}
[...]
可能是这样,但如果是这样,我想知道为什么会这样,为什么我们应该将 argc 和 argv 传递给 getopt(_long)。
谢谢。
【问题讨论】:
-
一个不常说明的假设是,您调用
getopt()等时始终使用argc和argv的相同值,而不是在每次调用时更改列表。如果您使用getopt()处理命令行参数,然后使用它访问其他一些参数集,您可能(不一定会)遇到问题。你在做这样的事吗? (基本上,没有对并发性的规定——它不是线程安全的——也没有对重用的规定。通常有一种半未公开的方式来重置系统,以便重新开始,但它会有所不同。) -
没有对
getopt的调用来自同一个线程,因此是按顺序完成的。
标签: c getopt getopt-long