에러가 나는 원인이 궁금합니다..
글쓴이: tlqkdto89 / 작성시간: 수, 2012/11/14 - 11:55오후
#include <string.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <dirent.h> #define MAX_CMD_ARG 10 const char *prompt = "myshell> "; char* cmdvector[MAX_CMD_ARG]; char cmdline[BUFSIZ]; void fatal(char *str) { perror(str); exit(1); } void command_cd(char* path) { chdir(path); } int makelist(char *s, const char *delimiters, char** list, int MAX_LIST) { int i = 0; int numtokens = 0; char *snew = NULL; if((s==NULL) || (delimiters==NULL)) { return -1; } snew = s + strspn(s, delimiters); if((list[numtokens] = strtok(snew, delimiters)) == NULL ) { return numtokens; } numtokens = 1; while(1) { if((list[numtokens] = strtok(NULL, delimiters)) == NULL) { break; } if(numtokens == (MAX_LIST-1)) { return -1; } numtokens++; } return numtokens; } int main(int argc, char**argv) { int i = 0; pid_t pid; while (1) { fputs(prompt, stdout); fgets(cmdline, BUFSIZ, stdin); cmdline[ strlen(cmdline) -1] ='\0'; makelist(cmdline, " \t", cmdvector, MAX_CMD_ARG); if(!strcmp(cmdline, "exit")) { exit(1); } if(!strcmp(cmdvector[0], "cd")) { command_cd(cmdvector[1]); } switch(pid=fork()) { case 0: makelist(cmdline, " \t", cmdvector, MAX_CMD_ARG); execvp(cmdvector[0], cmdvector); fatal("main()"); case -1: fatal("main()"); default: wait(NULL); } } return 0; }
exit, cd를 구현하였는데 cd를 실행하면 디렉토리 이동은 가능한데 fatal("main()"); 이 부분이 실행됩니다..
혹시 제가 구현한 것이 어떤 문제가 있는지 궁금합니다.. 감사합니다.
Forums:
cd 처리를 한 후에도 여전히 fork 하고 case
cd 처리를 한 후에도 여전히 fork 하고 case 0 에 들어가서 execvp 를 호출하니깐요.
그러나 cd 는 외부 프로그램이 아니다보니 찾지를 못해서 exec 이 실패하고, 그 다음 fatal()을 호출하죠.
command_cd 처리한 후 continue 로 바로 루프를 재반복시키면 될 것 같습니다.
좋은 하루 되세요!
실행하다 보면 cd를 구현한 뒤로는 mkdir
실행하다 보면 cd를 구현한 뒤로는 mkdir rmdir touch 같은 내장명령어가
실행되지 않습니다.. 왜 그런지 알 수 있을까요.?
댓글 달기