에러가 나는 원인이 궁금합니다..
글쓴이: 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 같은 내장명령어가
실행되지 않습니다.. 왜 그런지 알 수 있을까요.?
댓글 달기