쉘 프로그래밍 의문점 질문 드립니다..
글쓴이: tlqkdto89 / 작성시간: 목, 2012/11/15 - 8:08오후
#include <string.h> #include <unistd.h> #include <stdio.h> #include <stdlib.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) /command cd { 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); /* delimitersžŠ skip */ 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'; i = makelist(cmdline, " \t", cmdvector, MAX_CMD_ARG); if(!strcmp(cmdline, "exit")) { exit(1); } if(!strcmp(cmdline, "cd")) //command cd { command_cd(cmdvector[1]); continue; } 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; }
command cd부분을 구현하기 전까지는 mkdir rmdir touch 등 내부 명령어가 잘 실행됐었는데 구현하고 나니까 디렉토리 이동은
가능해졌지만 저런 내부명령어들이 이 프로그램을 실행한 뒤에는 잘못된 명령어라고 뜹니다... 제가 어느부분에서 실수한건지를
모르겠습니다.. ㅠ 그리고 여기에서 foreground, background 기능을 추가할 때에 &연산자를 검사해서 switch문 default부분에
구현하면 자꾸 에러가 납니다.. 그 부분에 대해서도 조언을 구하고 싶습니다.. 감사합니다.
Forums:
답변은 아닙니다만..
질문글을 올리실 때 계속 새로운 쓰레드를 열지 마시고.. 답글다는 형태로 올리시는게 답변다시는 분들께도 도움이 될 듯 하네요;
그리고 첨언을 하자면 과제는 같은 수업 듣는 친구들끼리 상의하는게 더 빠르지 않나요?
죄송합니다.. 제가 전과를 한 상태라... 혼자 듣고
죄송합니다.. 제가 전과를 한 상태라... 혼자 듣고 잇어서요.
makelist 가 두 번 불려버리네요. 그래서
makelist 가 두 번 불려버리네요.
그래서 한번 분해되었던 cmdline 을 또 분해하면서 뒤에 cmdvector 지정했던 게 날아가버립니다.
한 쪽은 지워주셔야겠고, 여기서 더 질문이 있으시면 윗분 말씀대로 그냥 여기서 계속 댓글로 쓰시는 게 좋겠습니다. 댓글이 새로 달리면 목록에서 다시 위쪽으로 올라가서 나오니까 묻혀서 답이 안 달리진 않을 겁니다.
좋은 하루 되세요!
.
제 아주 예전 기억으론 쉘 프로그래밍 시에 자기가 exec한 프로그램으로부터 시그널을 받는 부분을 구현해야 했던 것으로 기억하는데...
쉘 프로그래밍 고수분 없으신가요?-_-a
한번 더 질문드립니다.
if(!strcmp(cmdvector[i-1], "&"))
{
waitpid(-1, NULL, WNOHANG);
cmdvector[i - 1] = NULL;
continue;
}
제가 백그라운드 실행을 위해 이런 소스를 추가했습니다. 컴파일 후에 myshell을 실행시켜
sleep 100 & 이렇게 하면 바로 쉘 프롬프트가 뜨기는 하는데 ps를 누르면 진행중인 프로세스가 없습니다..
제가 맞게 구현한 것인지 궁금합니다 . raymundo님 항상 답글 달아주셔서 감사합니다.
저 if 단락이 어디 있느냐에 따라 다르겠지만
저 if 단락이 어디 있느냐에 따라 다르겠지만 switch 문 안에 있는 게 아니고 바깥쪽에 있을 것 같군요. (cmdvector 를 조작하는 건 exec 호출보다 이전이어야 할 테니)
그러면 continue 를 만나는 순간 while 루프 처음으로 돌아가 버릴테니 sleep 은 실행되지 않겠네요.
좋은 하루 되세요!
댓글 달기