2014-12-18 2 views
4

Пользователь прочитает строку, и я сохраню первое слово в качестве команды для execvp.Как использовать execvp()

Допустит, он наберет «кошки file.t» ... команда будет кот. Но я не уверен, как использовать этот 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.

Например:

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 (команда, указатель); } pointer = strtok (NULL, ""); if (pointer! = NULL) { strcpy (имя, указатель); } Могу ли я сделать 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 соответственно. Это помогает? –

Смежные вопросы