2013-03-02 13 views
6

Próbuję utworzyć podstawową powłokę z wbudowanymi poleceniami i mam pewne problemy z getopt. Oto wynik (używając valgrind):Czy można powtórzyć 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== 
$ 

I tu jest źródło (obcięty):

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

Więc po raz pierwszy uruchamia ją (mkdir -p) uznaje ją (-p) i drugi czas działa, nie działa. Jakieś pomysły?

+0

Czy może być tak, że Twój bufor standardowy nie dostaje flusehd po raz drugi z jakiegoś powodu? Spróbuj fflush (stdout) po puts? –

+2

"za pierwszym razem [program] go uruchamia [program, lub może' getopt() '?] Rozpoznaje ** to **". Co to jest*? –

+0

@ Code-Guru, przepraszam, ** to ** jak na fladze ('-p') – MiJyn

Odpowiedz

13

Jeśli chcesz skanować wiele wektorów trzeba zresetować getopt ustawiając optind do 1.

Zmienna Optind jest indeksem następny element argv [] wektorze mają być przetwarzane. Zostanie zainicjalizowany do 1 przez system, , a getopt() zaktualizuje go, gdy zakończy się z każdym elementem argv [].

Jeśli ustawienie optind na 1 nie działa, także spróbować 0, myślę Pamiętam czytanie o tym gdzieś.

+0

Dzięki, zobaczymy czy to działa :) – MiJyn

+3

Ustawienie 'optind' na 1 naprawiło to, ale nadal miałem ostrzeżenia z valgrind, więc próbowałem ustawić go na 0, a teraz działa idealnie. Dzięki! – MiJyn

+1

@ Miyyn Dobrze wiedzieć :-) – cnicutar

Powiązane problemy