UNIX 프로그래밍에서 chdir과 관련하여 질문 드립니다.
글쓴이: mshgood8 / 작성시간: 수, 2014/11/12 - 11:32오후
#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); } 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") == 0) { exit(1); } switch(pid=fork()){ case 0: /* chdir("/bin") 이렇게 하는 거 아닌가요? */ execvp(cmdvector[0], cmdvector); fatal("main()"); case -1: fatal("main()"); default: wait(NULL); } } return 0; }
이 코드는 학교에서 UNIX 프로그래밍 시간에 Shell Programming을 위해 받은 기본 코드입니다. 이 코드에 대해서는 대략적으로 이해하였는데요.
문제는 원래 이 기본코드를 실행하면 fork를 통해 자식 프로세스를 생성하여 case 0에서 execvp를 통해 mkdir,rmdir과 같은 명령어가 실행되어야 정상이거든요.
근데, 실행이 전혀 되지 않습니다. 반대로 LINUX에서 똑같은 프로그램을 실행시키면, 정상적으로 명령어가 먹힙니다.
원인을 알고보니, mkdir과 같은 명령어들이 들어있는 /bin으로 경로를 바꿔줘야 한다더라구요.
그래서 chdir로 경로를 바꿀려고 하는데, case 0에 chdir로 bin으로 바꿔줘도 소용이 없습니다.
어쨌거나 질문의 요지는, mkdir, rmdir과 같은 명령어를 사용하기 위해 경로를 /bin으로 바꿔줘야 하는데, 그게 안 되어 고민입니다.
왕초보라서 자세하게 이해가게 설명 좀 부탁드립니다.
Forums:
exe* 류의 함수의 첫번째 인자는 manual
exe* 류의 함수의 첫번째 인자는 manual 대로라면 full path를 가져야 하는 것으로 보입니다. glibc의 경우 execvp가 PATH 환경 변수를 처리를 해 주는 것으로 보이는데, 안되는 OS의 libc에서는 PATH 환경 변수 처리를 안해 주는 것으로 보입니다. 그러므로 첫번째 인자가 절대 경로가 아니라면 PATH 환경 변수를 이용하여 full path로 만들어 줘야 하지 않을까 유추해 봅니다.
일단은 execvp의 에러 코드를 확인해 보시고 해당 OS의 manual page에서 error code를 확인해서 어떠한 문제인지 정확하게 확인하시는 것이 좋을 듯 싶습니다.
답변 감사한데 질문을 좀 수정하겠습니다
ls는 되는데 ls -l과 같이 인자가 들어가면 안됩니다
그건 왜그런가요?
댓글 달기