2015-12-06 2 views
-4

Я хотел бы получить команду which в качестве параметра execv. Например, пользовательские типы «firefox» в качестве входных данных. Он покажет путь к файлу с командой which firefox, и я бы хотел использовать его в execv. Вот моя попытка:Системная команда как переменная в C

int main(void) 
{ 
      //char inputBuffer[MAX_LINE]; /*buffer to hold command entered */ 
      char *args[MAX_LINE/2 + 1]; /*command line arguments */ 



    while (1){ 

      char command1[50] = "which "; 
      char *input = args[0]; /* args[0] holds input */ 
      strcat(command1,input); 

      char *const parmList[] = {input,NULL}; 

      char buf[100]; /* will convert command to the file path */ 
      char *str; 
      FILE *file; 

      if (NULL == (file = popen(command1, "r"))) { 
       perror("popen"); 
       exit(EXIT_FAILURE); 
       } 

      while (fgets(buf, sizeof(buf), file) != NULL) { 

       } 
       pclose(file); 

     int count=0; 
     for(int m=0;m<buf[m];m++){ 
      if(buf[m] != ' ') 
       count++; 
     } 


     char x5[count]; 
      for(int t=0;t<=count;t++){ 
       x5[t]=buf[t]; 
      } 

      printf("%s\n\n\n\n",x5); /*i tried to delete spaces from 'buf' 

     but there is something wrong in file path the output is something like that : 
     (input : firefox) 
     usr/bin/firefox 
     (some weird characters) 

because of weird characters execv don't get filepath correctly. I have to this 
only with execv 
*/ 



       pid_t childpid; 
       childpid = fork(); 

      if (childpid == -1) { 
      printf("error"); 
      } 

      if (childpid == 0) { 

      execv(x5, parmList); 

      } 
     } 

    } 
+0

в вызове 'strcat', у вас есть аргументы в обратном направлении – DBug

+0

[yawn], кто-то говорит суммирование? –

+1

Эта строка: 'char * input = args [0]; не будет работать по нескольким причинам. 1) объявление 'main()' не является 'int main (int argc, char * args [])', поэтому аргументы [0] недоступны, и эта строка: 'char * args [MAX_LINE/2 + 1] ; 'только объявляет массив указателей на указатели на char, он не дает ни одному из этих указателей какое-либо полезное значение. – user3629249

ответ

1

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

Примечания : всегда помещайте литерал слева, чтобы иметь ошибку catch компилятора, если случайно написал assignment, а не инструкцию comparison.

1) не удалось обрезать любую завершающую строку новой строки из массива buf[].

2) эти петли, ну, не правильно. Предложите:

// remove trailing newline 
char * newline = NULL; 
if(NULL != (newline = strstr(buf, "\n"))) 
{ // then trim newline 
    *newline = '\0'; 
} 

// data declarations for removing space characters 
char *sourceIndex = buf; 
char *targetIndex = buf; 

// following loop removes space characters, in place 
// and stops when the string terminator char encountered 
for(; sourceIndex; sourceIndex++) 
{ 
    if(' ' != *sourceIndex) 
    { // then char to have in final output 
     *targetIndex = *sourceIndex; // copy it 
     targetIndex++;    // step to next position in target 
    } 
} 

*targetIndex = '\0'; // terminate the (possibly shorter) string 
... 

// pass to new process 
if(0 == childpid) 
{ // then child process 
    execv(buf, parmList); // only returns if execv() failed 
    perror("execv failed"); 
    exit(EXIT_FAILURE); 
} 
Смежные вопросы