2012-10-03 3 views
3

저는 C에서 매우 새롭고 C (기본)에서 기본 셸을 작성해야하는 OS 클래스에 있습니다. 실제로 실제로 중도에가는 중입니다. 저는 작업을 진행하는 동안 C 기본 사항을 배우려고합니다.C에서 execve를 사용하여 mkdir syscall을 호출하십시오.

포크 후에 exec를 사용하려고합니다. 지금은 mkdir입니다. 논쟁은 나를 통해 조금씩 벗어나지 만, 나는 그것을 알아 내려고 노력해 왔고, 누군가 내가 잘못한 곳을 말해 줄 수 있기를 바랬다.

  } else { 
      //fork exec 
      int pid = fork(); 
      if (pid == 0) { 
       printf("%s",my_argv[0]); 
       execve("/bin/mkdir",my_argv,0); 
      } else wait(NULL); 
     } 

이것은 mkdir 호출에 응답하는 부분입니다. 지금, 나는 라인은 [] 즉 사용자의 입력이 명령은 인수가

command = strtok(line, DELIMITERS); 

로 촬영되어

arg = strtok(0,DELIMITERS); 
     my_argv[0] = arg; 

모든 것이 잘 컴파일하지만, MKDIR 작동하지 않습니다. my_argv [0]을 인쇄하면 예상 한 올바른 인수가 제공됩니다. 나는 이것이 바보 같은 것이라고 확신하지만 어떤 조언도 감사 할 것입니다.

모든 코드 :

int main(int argc, char *argv[]) 
{ 
char *command; 
char line[MAXLINE]; 
char *arg = NULL; 
char *my_argv[]; 


while(1) { 
    printf(PROMPT); 
    if (fgets(line,MAXLINE,stdin) != NULL) { 
     //take out \n 
     line[strlen(line)-1] = '\0'; 
    } 
    //looks for first delimiter, saves as the command 
    command = strtok(line, DELIMITERS); 


    //start looking at what command it is by comparing 
    if (strcmp(command,"cd")==0) { 
     //if they equal zero, they match 
     //this is a cd command, must have following arg 
     if (argv[1] == NULL) chdir("/"); 
     else chdir(argv[1]);//chdir is the system call for cd 
    } else if (strcmp(command,"exit")==0) { 
     break; 
    } else if (strcmp(command,"mkdir")==0){ 
     arg = strtok(0,DELIMITERS); 
     my_argv[0] = arg; 
     my_argv[1] = NULL; 
     if (!arg) { 
      printf("Usage: mkdir missing arg\n"); 
     } else { 
      //fork exec 
      int pid = fork(); 
      if (pid == 0) { 
       printf("%s",my_argv[0]); 
       //mkdir(arg); 
          execve("/bin/mkdir",my_argv,0); 
      } else wait(NULL); 
     } 
    } 


} 
return 0; 
} 
+1

참고 종료해야하는 거기에 첫 번째 인수이다 'mkdir' 함수] (http://pubs.opengroup.org/onlinepubs/009695399/functions/mkdir.html). 당신은 정말로 이것을위한 다른 모든 프로그램을 실행할 필요가 없습니다. – cHao

+0

네, 그랬 으면 좋겠어요. – dundermiff

+0

'mkdir' 함수를 사용할 수없는 이유가 있을까요, 아니면 그 과제의 요구 사항입니까? –

답변

5
  • argv[0] 프로그램
  • argv[1]의 이름을 포함는
  • 인수 목록이 NULL이
+0

my_argv [1] = NULL에 넣고 "mkdir test"를 시도하고 테스트 : 누락 된 피연산자가 반환되었습니다. 나는 또한 내가 같은 디렉토리에 있는지 확인하고있다. XD – dundermiff

+0

업데이트를 보자. ..... –

+0

argv [0]를 출력 할 때 내가 찾고있는 인수를 얻었 기 때문에 나는 몰라. 따라서 입력은 mkdir testFolder이고 argv [0]은 testFolder입니다. – dundermiff