2014-10-01 1 views
0

OS 프로젝트 용 C 언어로 쉘을 빌드하려고합니다. 리디렉션 부분을 수행 할 때 문제가 발생합니다. ls은 정상적으로 작동하지만, 수행 할 때는 ls > somefile입니다. 그것은 나에게 "ls : can not access> : No such file or directory"오류를줍니다. 여기 ls에서execvp, ls 출력 재 지정

while(in){ 
      argv[c]=strdup(in); \\in is output of strtok applied on input string 
       in=strtok(NULL,"\n , "); 
      c++; 
      } 
    argv[c]=NULL; 

    int rc=fork(); 
     if(rc==0){ 
     int flag = 0; 
     int index = 0; 
     int i; 
     for(i= 0; i <c;i++) 
     { 
     if(strcmp(argv[i],">") == 0) 
     { 
     flag = 1; 
     index = i+1; 
     } 
     } 
     if(flag == 1) 
     { 
     fclose(stdout); 
     fopen(argv[index],"w+"); 
     } 
     execvp(argv[0],argv); 
    } 
     else if(rc>0){ 
      (void) wait(NULL);} 
    } 
return 0; 
} 

답변

0

그 오류가 인수로 ls>을 통과 함을 말하고 내 코드의 일부이다.

그래서 우리가 당신의 execvp 호출을 살펴 보자 :

execvp(argv[0],argv); 

을 그래서 당신이 양산 ls에 인수로 argv의 전체를 사용하고 있습니다.

위의 처리에서 이미 처리 한 리디렉션 인수를 argv에서 제거하여 ls에 표시되지 않도록 하시겠습니까?

사이드 노트 : fopen은 새로 열린 파일을 이전에 stdout에 의해 사용 된 fd로 할당한다고 가정합니까? 그것은 나에게 현명하지 못한 가정처럼 보입니다 (정상적으로 작동한다고해도).

아, 들여 쓰기에는 약간의 작업이 필요할 수 있습니다.

+0

나는이 문제를 봤다고 생각한다. 리디렉션 인수를 제거하지 않았습니다. 그리고 네, fopen이 새로운 파일에 설명자 1을 할당한다고 가정합니다. 나는 다른 방법으로 그것을하는 방법을 모른다. @Eten Reisner –

+0

@AnmolYousaf ['man fopen'] (http://linux.die.net/man/3/fopen)에는 유용한 다른 기능이 있습니다. 또한 ['man dup'] (http://linux.die.net/man/3/dup). –

+0

감사합니다. @EtanReisner –