2013-03-02 5 views
6

기본 명령을 사용하여 기본 셸을 만들려고합니다. 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되지 않을 수 있습니까? puts 후에 fflush (stdout)를 시도 하시겠습니까? –

+2

"처음으로 [프로그램이] 그것을 실행하면 [프로그램, 아니면'getopt()'?]이 ** it **"을 인식합니다. * it * 무엇입니까? –

+0

@ Code-Guru, 죄송합니다. ** 플래그 ('-p')와 같습니다. – MiJyn

답변

13

는 변수 OPTIND 처리 될는 argv [] 벡터의 다음 요소의 인덱스 1

optind 설정하여 getopt를 재설정 할 필요가있다. , 에 의해 1로 초기화되고 getopt()는 argv []의 각 요소로 끝날 때이를 갱신해야한다. 1-optind를 설정하면 작동하지 않습니다

경우도 0을 시도, 내가 그 곳에 대한 책을 읽은 기억 생각합니다.

+0

고마워요,이게 작동하는지 볼 수 있습니다 :) – MiJyn

+3

'optind'를 1로 설정했지만 여전히 valgrind로부터 경고를 받았기 때문에 0으로 설정하려고 시도했지만 이제는 완벽하게 작동합니다. 감사! – MiJyn

+1

@MiJyn 알아두면 좋을 것 :-) – cnicutar

관련 문제