UNIX 프로그래밍에서 chdir과 관련하여 질문 드립니다.

mshgood8의 이미지

#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으로 바꿔줘야 하는데, 그게 안 되어 고민입니다.
왕초보라서 자세하게 이해가게 설명 좀 부탁드립니다.

김정균의 이미지

exe* 류의 함수의 첫번째 인자는 manual 대로라면 full path를 가져야 하는 것으로 보입니다. glibc의 경우 execvp가 PATH 환경 변수를 처리를 해 주는 것으로 보이는데, 안되는 OS의 libc에서는 PATH 환경 변수 처리를 안해 주는 것으로 보입니다. 그러므로 첫번째 인자가 절대 경로가 아니라면 PATH 환경 변수를 이용하여 full path로 만들어 줘야 하지 않을까 유추해 봅니다.

일단은 execvp의 에러 코드를 확인해 보시고 해당 OS의 manual page에서 error code를 확인해서 어떠한 문제인지 정확하게 확인하시는 것이 좋을 듯 싶습니다.

mshgood8의 이미지

ls는 되는데 ls -l과 같이 인자가 들어가면 안됩니다
그건 왜그런가요?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.