2013-04-09 2 views
2

현재이 오류로 고민하고 있습니다. execvp();를 사용하여 명령을 실행하기 위해 fork()를 사용하여 쉘 에뮬레이터를 작성했습니다. 인수가없는 ls를 제외하고 거의 모든 명령을 내 쉘로 구문 분석하려고합니다. 내가 LS의 -lah을 실행하려고하면 은, 모든 작동하지만, 간단한 LS는, 다음과 같은 오류가 발생하지 않습니다 (다만 필수)execvp - ls : fts_open : 해당 파일이나 디렉토리가 없습니다.

pid = fork(); 
     if (pid==0) 
     { 
     puts("CHILD"); 
     puts(args[0]); 
     puts(args[1]); 
     printf("%d\n", strlen(args[1])); 
     args[2] = NULL; 
     execvp(args[0], args); 
     } 
     else wait(NULL); 
     puts("BACK TO PARENT"); 
    } 
: 여기
ls: fts_open: No such file or directory 

내 코드의 조각이다

이곳은 LS의 출력입니다 : 당신이 볼 수

ls 
CHILD 
ls 

0 
ls: fts_open: No such file or directory 
BACK TO PARENT 

, 인수 [0] LS, 인수를 포함 [1], 비어 인수, 인수의 길이가 없습니다로 [1] 0이지만 오류가 계속 발생합니다.

어떤 아이디어 일 수 있습니까?

편집 : 그것을 찾기위한 조나단 레플러에 대한

명예 : (이 Mac에서 바로 문제처럼도 보인다)

점은 인수 [1] 정말 빈되지 않는 것입니다, 그래서 OS는 분명히 존재하지 않는 ''파일을 열려고 시도합니다. 실제로는 이름이 아니기 때문에 외형은 생성 될 수 없습니다.

그래서, 내가 한 일은 다음과 같습니다. args [1]의 len을 확인하십시오. 값이 0이면 NULL로 설정하십시오. 더 이상 인수가없는 경우

pid = fork(); 
     if (pid==0) 
     { 
     puts("CHILD"); 
     puts(args[0]); 
     puts(args[1]); 
     if (strlen(args[1]) == 0) 
      args[1] = 0; 
     args[2] = NULL; 
     execvp(args[0], args); 
     } 
     else wait(NULL); 
     puts("BACK TO PARENT"); 
    } 
+0

'args' ('args [1]'에 무엇을 설정했는지, "empty"는 무엇입니까?)와 코드의 전체 정의를 보여줄 수 있습니까? –

답변

5

는 포인터가 0 길이 문자열을하지 않은 널 포인터, 널 (null)이어야한다 (다만 자유롭게 메모리는 정말 도움이되지 않았다).

$ ls '' 
ls: fts_open: No such file or directory 
$ 

가 너무 Mac에서 실행하고 있습니까 : 그냥 순수한 호기심

pid = fork(); 
if (pid==0) 
{ 
    puts("CHILD"); 
    puts(args[0]); 
    fflush(stdout); 
    args[1] = 0; 
    execvp(args[0], args); 
    fprintf(stderr, "Failed to exec %s\n", args[0]); 
    exit(1); 
} 
else 
    wait(NULL); 
puts("BACK TO PARENT"); 

, 내 명령 줄에서이 시도? (나는 똑같은 메시지가 내 반응을 묘사하기 시작하지 않는다는 것에 놀랐다!) 더 흥미로운 점은 파일을 만드는 것이 오류 메시지를 없애지 않는 것 같다는 것이다. 이상한 행동은 ls이지만 잘못된 요청에 대한 응답으로 (빈 문자열 인 파일 이름이 없음).

+0

감사합니다. 내 코드가 어떻게되었는지 보여주기 위해 내 질문을 업데이트 하겠지만 기본적으로 args [1]의 len을 검사하고, 0이면 NULL로 설정했습니다. –

+0

예, 저는 Mac에서도 실행 중입니다. 몇 가지 빠른 연구를했고 fts_open은 OS와 관련이있는 것 같습니다. 아마도 파일 열기에 관한 것입니다. –

+0

'fts_open'은 디렉토리 계층을 트래버스하는 내부 함수입니다. 에러 메시지는'ls' 프로그램에서 에러 코드 'ENOENT'를 반환 한 함수'fts_open'에서 에러가 발생한 것을 의미합니다. – melpomene