2012-10-07 3 views
1

저는 몇 시간 동안이 간단한 리눅스 쉘에 어려움을 겪었습니다. 그리고 어떤 이유로 지금 당장은 제대로 작동하지 못합니다. 이 셸이 어떻게 작동하지 않는지에 대한 예가 mkdir 명령이기 때문에 무언가가 내 입력이나 무언가를 어떻게 처리하는지 심각하게 어지럽 힙니다. 무작위로 내가 만들려고 시도한 적이없는 임의의 디렉토리를 만들지 않을 것이며, 디렉토리를 만들 때마다 임의의 이름을 가진 다른 디렉토리를 생성하는 것을 관리 할 때마다 분명히 만들지 않았습니다. 무언가가 엉망이고 난 단지 단서가 없습니다. 왜냐하면 저는 마지막 인자 배열을 출력했기 때문에 거기에서 괜찮아 보입니다. 누군가 나를 위해 이것 좀 봐 주시겠습니까.간단한 리눅스 쉘 구현 문제

#include<stdlib.h> 
#include<stdio.h> 
#include<sys/types.h> 
#include<string.h> 
#include<unistd.h> 
#include<sys/wait.h> 


int main(int argc, char *argv[]){ 
while(1){ 
    char line[100], *temp, *split[15]; 
    int child_id; 
    printf("$ "); 
    fgets(line, sizeof(line), stdin); 
    line[strlen(line)-1] = '\0'; 

    temp = strtok(line, " "); 
    int i = 0; 
    while(temp != NULL){ 
     split[i] = temp; 
     temp = strtok(NULL, " "); 
     i++; 
    } 

    char *args[i]; 
    int j; 
    for(j = 0; j < i; j++){ 
     args[j] = split[j]; 
     printf("%s\n", args[j]); 
    } 
    child_id = fork(); 
    if(child_id == 0){ 
     execvp(args[0], args); 
     exit(0); 
    }else{ 
     wait(&child_id); 
    } 


    } 

} 
+0

왜 'args' 배열을 사용하면 좋을까요? 직접 'split'을 사용하십시오 ... – nneonneo

+0

char 배열을 사용하여 원래 배열이 문제를 일으키고 있는지 확실하지 않았기 때문에 사용하지 않았으므로 결코 할당하지 않았을 것입니다. 이슈. 나는 지나치게 조심스러워했다. – jasimp

답변

2

execvp()를 사용 args 어레이의 최종 요소 (이 커맨드 라인 인수 목록 종료 커널을 말한다) NULL이어야한다.

당신은 strtok() 루프 후 split[i] = NULL;를 추가하여이 작업을 수행 할 수 있어야한다 (오, 위의 댓글에서 언급 한 바와 같이 필요는 split를 사용 args에 배열을 복사 없음).

+0

6 년 동안 프로그래밍을 해 줘서 고맙습니다. 이전까지 해결할 수 없었던 오류가 발생하지 않았습니다. 그것은 나를 몇 시간 동안 미치게 만들었습니다 ... 당신의 도움에 다시 한번 감사 드리며, 지금 일이 잘되고 있습니다. – jasimp

관련 문제