是否可以重复getopt
问题描述:
我正在尝试使用内置命令创建基本shell,并且我在getopt方面遇到了一些问题。这里是(使用Valgrind的)输出:是否可以重复getopt
$ mkdir -p foo/bar
mkdir
-p
foo/bar
FLAGON
$ mkdir -p foo/test
mkdir
-p
foo/test
==15377== Invalid read of size 1
==15377== at 0x5201BBE: _getopt_internal_r (in /usr/lib/libc-2.17.so)
==15377== by 0x5202CEA: _getopt_internal (in /usr/lib/libc-2.17.so)
==15377== by 0x5202D37: getopt (in /usr/lib/libc-2.17.so)
==15377== by 0x40351A: shell_ns_cmd_mkdir (shell.c:542)
==15377== by 0x403AB4: normal_shell_cb (shell.c:610)
==15377== by 0x402E8E: shell_mainloop (shell.c:402)
==15377== by 0x401B67: main (main.c:52)
==15377== Address 0x54e0912 is 2 bytes inside a block of size 3 free'd
==15377== at 0x4C2AD3C: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==15377== by 0x402C93: shell_mainloop (shell.c:384)
==15377== by 0x401B67: main (main.c:52)
==15377==
$
,这里是源(裁剪):
for (i = 0; i < argc; i++) {
puts(argv[i]);
}
while ((c = getopt(argc, argv, "p")) != -1) {
switch (c) {
case 'p':
puts("FLAGON");
mkparents = true;
break;
case '?':
fprintf(stderr, "invalid option -- %c", optopt);
ret = 127;
goto end;
break;
}
}
所以运行时,它第一次(mkdir -p
)承认它(-p
)和第二它运行的时间,它没有。有任何想法吗?
答
如果要扫描多个矢量则需要通过设置optind
重置getopt
为1
变量OPTIND是要被处理的的argv [] 向量的下一元素的索引。 由系统, 将其初始化为1,并且getopt()应在其与每个元素 argv []完成时更新它。
如果设置optind
1不工作,也尽量0
,我想我记得读有关的地方。
难道你的stdout缓冲区由于某种原因第二次没有获取flusehd? put后尝试fflush(stdout)? – 2013-03-02 22:07:46
“程序第一次运行它[程序,或者'getopt()'?]可以识别** it **”。它是什么*? – 2013-03-02 22:07:51
@代码大师,对不起,**它**在国旗('-p') – MiJyn 2013-03-02 22:25:58