2014-08-29 74 views
0

我正在使用該程序運行shell命令,該命令通過命令行參數使用系統調用execvp()fork()。這裏arglist是一個二維數組,其中包含命令名稱及其參數列表。我將命令名稱作爲第一個參數,將arglist數組作爲第二個參數。但它不起作用。 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 2014-08-29 16:12:58

+0

當你說它不是'使用命令行參數'你的意思是'execvp'沒有額外的參數成功完成?另外,既然你提到'PATH',你有沒有試過給它提供一個完整路徑的命令? – 2014-08-29 16:13:10

+0

似乎你也在複製arglist中的命令名稱,也許這就是爲什麼它失敗 – Arpit 2014-08-29 16:16:15

回答

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的除了一個創造的arglist本身的空間。

+0

另外,你不應該在C中投入malloc返回地址。 – knarf 2014-08-29 16:30:00