2014-12-18 2 views
4

사용자는 줄을 읽고 첫 단어를 execvp의 명령으로 유지합니다.execvp() 사용 방법

하자 그가 입력 할 것이라고 "고양이 file.txt" ... 고양이 명령이 될 것입니다. 그러나 나는 이것을 사용하는 방법을 모르겠다. execvp(), 나는 튜토리얼을 읽었지만 여전히 이해하지 못했다.

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    char *buf; 
    char command[32]; 
    char name[32]; 
    char *pointer; 
    char line[80]; 
    printf(">"); 

    while((buf = readline(""))!=NULL){ 
     if (strcmp(buf,"exit")==0) 
     break; 

     if(buf[0]!=NULL) 
     add_history(buf); 

     pointer = strtok(buf, " "); 
     if(pointer != NULL){ 
      strcpy(command, pointer); 
     } 

     pid_t pid; 

     int status; 

     if ((pid = fork()) < 0) {  
      printf("*** ERROR: forking child process failed\n"); 
      exit(1); 
     } 
     else if (pid == 0) {   
      if (execvp(command, buf) < 0) {  
       printf("*** ERROR: exec failed\n"); 
       exit(1); 
      } 
     } 
     else         
     while (wait(&status) != pid)  
      ; 
     free(buf); 
     printf(">"); 
    }///end While 
    return 0; 
} 
+0

무슨 뜻 이죠 당신이 그것을 얻을하지 않습니다? 더 구체적으로 말하십시오. – SSC

+0

[RTFM] (http://linux.die.net/man/3/execvp) –

+0

execvp에서 어떤 인수를 전달해야하는지 모르겠습니다. – Axl

답변

10

첫 번째 인수는 실행하고자하는 파일이고, 두 번째 인수는 the man page에 지정된 파일에 적절한 인수를 나타냅니다 널 (null)로 종료되는 문자열의 배열입니다. 예를 들어

:

char *cmd = "ls"; 
char *argv[3]; 
argv[0] = "ls"; 
argv[1] = "-la"; 
argv[2] = NULL; 

execvp(cmd, argv); //This will run "ls -la" as if it were a command 
+0

이 코드는 다소 효과가 있지만, * argv에 cmd 다음에 나머지 행을 포함시키는 방법은 무엇입니까? im을 다음과 같이 토큰으로 나누어 보자 : pointer = strtok (buf, ""); if (pointer! = NULL) { strcpy (명령, 포인터); } 포인터 = strtok (NULL, ""); if (pointer! = NULL) { strcpy (name, pointer); } char * argv [3] = {name, "\ 0"}; execvp (명령, 이름); ? – Axl

+1

@Axl 당신이 무엇을 요구하고 있는지 확실하지 않습니다. 그것은 별도의 질문입니까? –

+1

@Axl 나는 지금 내가 생각하기에 - 쉘을 만들려고한다고 생각 하나? 사용자 입력으로 모두 가져온 후에 문자열을 분할하는 함수를 작성하십시오. 그래서 사용자가 "ls -la"를 입력하면, 그것을 취하는 함수를 작성하고 문자열을 공백으로 나눈 다음 cmd = split [0], argv [0] = split [0], argv [1] = split을 설정합니다 [2], argv [3] = NULL이 적절하다. 그게 도움이 되니? –