是否可以重复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)和第二它运行的时间,它没有。有任何想法吗?

+0

难道你的stdout缓冲区由于某种原因第二次没有获取flusehd? put后尝试fflush(stdout)? – 2013-03-02 22:07:46

+2

“程序第一次运行它[程序,或者'getopt()'?]可以识别** it **”。它是什么*? – 2013-03-02 22:07:51

+0

@代码大师,对不起,**它**在国旗('-p') – MiJyn 2013-03-02 22:25:58

如果要扫描多个矢量则需要通过设置optind重置getopt为1

变量OPTIND是要被处理的的argv [] 向量的下一元素的索引。 由系统, 将其初始化为1,并且getopt()应在其与每个元素 argv []完成时更新它。

如果设置optind 1不工作,也尽量0,我想我记得读有关的地方。

+0

谢谢,将看看这是否有效:) – MiJyn 2013-03-02 22:24:39

+3

设置'optind'为1固定它,但我仍然有valgrind的警告,所以我试着将它设置为0,现在它完美的工作。谢谢! – MiJyn 2013-03-02 22:35:33

+1

@MiJyn相关知识:-) – cnicutar 2013-03-02 22:36:14