2014-08-29 2 views
0

Я работаю над этой программой для запуска команды оболочки, заданной с помощью аргумента командной строки, с использованием системных вызовов execvp() и fork(). Здесь arglist представляет собой 2D-массив, который содержит имя команды и список аргументов. Я передаю имя команды в качестве первого аргумента, а массив arglist - вторым аргументом. Но это не работает. man-страница execvp() говорит, что она будет искать заданную команду по умолчанию в каталогах, определенных переменной PATH, поэтому я передаю только имя команды.execvp не работает с аргументом командной строки

#include<stdio.h> 
#include<sys/types.h> 
#include<stdlib.h> 
#include<string.h> 

void executeCommand(char *command,char **arglist){ 

    int pid; 
    int status; 

    pid=fork(); 

    printf("%s %s\n",command,arglist[1]); 

    if(pid == -1){ 
     printf("fork failed\n"); 
     exit(1); 
    } 
    else if(pid==0){ 

     if(execvp(command,arglist) == -1){ 
      printf("execution of command failed\n"); 
      exit(1); 
     } 
     exit(0); 
    } 
    else { 

     while(wait(&status) != pid); 

     printf("Parent Exiting\n"); 
     exit(0); 
    } 


} 


int main(int argc,char **argv){ 

    char **arglist,*com; 
    int i,k=1; 

    if(argc>2){ 
     arglist = (char**)malloc(sizeof(char*)*(argc)); 
     for(i=0;i<argc-1;i++){ 
      arglist[i] = (char*)malloc(sizeof(char)*1024); 

     } 
     com = (char*)malloc(sizeof(char)*strlen(argv[1]));  

     strcpy(com,argv[1]); 
     for(i=1;i<=(argc-1);i++,k++){ 
      strcpy(arglist[k],argv[i]); 

     } 
     arglist[k] = NULL ; 
     for(i=0;i<argc;i++){ 
      printf("%s\n",argv[i]); 
     } 

     executeCommand(argv[1],arglist); 



    } 

    //printf("%d\n",argc); 




    return 0; 
} 
+0

Итак, какой выход вы получаете? команда не удалась? – Arpit

+0

Когда вы говорите, что это не 'работа с аргументами командной строки', вы имеете в виду, что' execvp' успешно завершен без дополнительных аргументов? Кроме того, поскольку вы упомянули «PATH», попробовали ли вы дать ему команду с полным путем? –

+0

Кажется, что вы также копируете имя команды в arglist, возможно, именно поэтому она терпит неудачу – Arpit

ответ

0

Вы не выделять достаточно места для команды, когда вы делаете

com = (char*)malloc(sizeof(char)*strlen(argv[1])); 

, поскольку он не делает пространство для терминатора, вам нужно добавить один к результату StrLen как в

com = (char*)malloc(sizeof(char)*(1+strlen(argv[1]))); 

Еще проще было бы использовать strdup вместо malloc/strcpy. Тогда вам просто нужно сказать

com = strdup(argv[1]); 

и

arglist[k] = strdup(argv[i]); 

и удалить все mallocs, кроме того, создает пространство для самого списка аргументов.

+0

Кроме того, вы не должны указывать адрес возврата malloc в C. – knarf

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