2013-03-02 18 views
6

tekrarlamak mı. İşte (valgrind kullanarak) çıktısı: Buradamümkün ben yerleşik komutlarla temel kabuk oluşturmak için çalışıyorum ve ben getopt bazı sorunlar yaşıyorum 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== 
$ 

Ve kaynak edilir (kesik):

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

yüzden onu ilk çalıştırdığında (mkdir -p) o (-p) ve ikinci tanır Zaman çalışır, değil. Herhangi bir fikir? Birden vektörleri taramak istiyorsanız

+0

sizin stdout'u tampon nedense ikinci kez flusehd almıyor olabilir mi? Koyar sonra fflush (stdout) deneyin? –

+2

"program [program] ilk çalıştırdığında [program veya belki de 'getopt()'?] ** algılar ** ". Bu ne*? –

+0

Kod-Guru, üzgünüm, ** o ** bayrağı gibi ('-p') – MiJyn

cevap

13

değişken optind işlenecek argv [] vektörün sonraki elemanın endeksidir 1.

için optind ayarlayarak getopt sıfırlamak gerekir. sisteme, ve getopt() o argv [] 'nin her elemanı ile tamamlandığında olarak güncelleyecektir tarafından 1'e başlatıldı edilir. 1 optind ayarı çalışmıyor

ise de 0 deneyin, ben bundan yerde okumayı unutmayın düşünüyorum.

+0

sayesinde göreceksiniz, ama yine de valgrind uyarıları vardı, bu yüzden 0 olarak ayarlamak çalıştı ve şimdi mükemmel çalışıyor. Teşekkürler! – MiJyn

+3

düzelttim 1 'optind' ayarlanması – MiJyn

+1

@MiJyn Bilmekte fayda var :-) – cnicutar

İlgili konular