Est-il possible de répéter getopt

J’essaie de créer un shell de base avec des commandes intégrées et je rencontre des problèmes avec getopt. Voici le résultat (en utilisant valgrind):

$ 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== $ 

Et voici la source (coupée):

 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; } } 

Ainsi, la première fois qu’il s’exécute ( mkdir -p ) le reconnaît ( -p ) et la deuxième fois, il ne le fait pas. Des idées?

Si vous souhaitez parsingr plusieurs vecteurs, vous devez réinitialiser getopt en définissant optind sur 1.

La variable optind est l’index du prochain élément du vecteur argv [] à traiter. Il doit être initialisé à 1 par le système et getopt () le mettra à jour à la fin de chaque élément de argv [].

Si le réglage de optind sur 1 ne fonctionne pas, essayez également 0 , je pense me souvenir d’avoir lu quelque chose à ce sujet.