我正在使用系统调用execvp()
和fork()
运行此程序来运行通过命令行参数给出的shell命令。这里arglist是一个包含命令名称及其参数列表的2D数组。我将命令名称作为第一个参数传递,将arglist数组作为第二个参数传递。但它没有用。 execvp()
的手册页说它会在PATH变量定义的目录中默认查找给定的命令,这就是我传递命令名的原因。
#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 :(得分: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]);
并删除除了为arglist本身创建空间的malloc之外的所有malloc。