2017-02-26 11 views
1

한 줄에 여러 명령으로 명령 줄 인터프리터를 작성하고 싶습니다.명령 줄 인터프리터에서 한 줄에 여러 명령 사용

나는 한 줄에 하나의 comamnd에서 작동하는 프로그램을 만들었지 만, 더 많은 명령을 입력하지 않으면 comamnds가 다음과 같이 입력됩니다. ls -l; pwd; 고양이 파일; 그렇소.

먼저 내가 인수를 구문 분석, 난 배열에 넣어 그리고 난이 기능이 있습니다

pid_t pid; 
pid = fork();  

switch(pid) { 
    case -1: 
     printf("DEBUG:Fork Failure\n"); 
     exit(-1); 
    case 0: 
     execvp(cmd[j], cmd); 

     if(execvp(cmd[j], cmd) == -1) { 
      printf("Command Not Found\n"); 
      exit(0); 
     } 

    default: 
    wait(NULL); 
    printf("DEBUG:Child Finished\n"); 
} 

내 파서입니다 :

printf("shell> "); 

fgets (input, MAX_SIZE, stdin); 

if ((strlen(input)>0) && (input[strlen (input) - 1] == '\n')) { 
    input[strlen (input) - 1] = '\0'; 
} 


printf("INPUT: %s\n", input); 

cnd = strtok(input, " ;"); 

int i = 0; 

while(cnd != NULL) {  
    cmd[i] = cnd; 
    i++; 
    cnd = strtok(NULL, ";"); 

나는 내 문제를 해결하기 위해 파이프를 사용해야한다고 생각 ,하지만 어떻게? 아이디어가 있으십니까?

죄송합니다 나쁜 영어

+0

하나의 명령이 올바르게 구문 분석되지만 여러 명령이 올바르게 해석되지 않으면 파서에 문제가있는 것입니다. 당신은 당신의 파서를 보여주지 않습니다 ... – StoryTeller

답변

0

당신이 그것을 설명하는 방법에 대한, 당신이 ls의 출력을 파이프, 다른 후 명령 하나를 실행하기를 원하지만 그들 외에 (서로 통신이없는 것 같다 ~ pwd 그냥 이해가 안돼).

해결 방법은 간단합니다. 입력을 세미콜론으로 분할하고 각 명령을 단일 명령처럼 처리하십시오 (그게 바로 그 이유입니다). 그것은 당신이 예를 들어, 이것을 구현할 수있는이

input = read_next_line(); 
while ((next_command = get_next_command(input)) != NULL) 
{ 
    execute_command(next_command); 
} 

처럼 보일 수있는 몇 가지 의사 코드와

strtok 또는 유사한 기능.

+0

나는 그것을했습니다 .. 내가 입력을 분할하고 배열에 넣어, 나는 배열이 올바른지 확인하십시오. 내가 명령을 실행하려고하면 "명령을 찾을 수 없습니다" – Xri