我正在使用該程序運行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;
}
那麼你得到的輸出是什麼?命令失敗? – Arpit 2014-08-29 16:12:58
當你說它不是'使用命令行參數'你的意思是'execvp'沒有額外的參數成功完成?另外,既然你提到'PATH',你有沒有試過給它提供一個完整路徑的命令? – 2014-08-29 16:13:10
似乎你也在複製arglist中的命令名稱,也許這就是爲什麼它失敗 – Arpit 2014-08-29 16:16:15