gpt4 book ai didi

c - execvp 不适用于命令行参数

转载 作者:行者123 更新时间:2023-11-30 17:29:37 29 4
gpt4 key购买 nike

我正在开发这个程序,使用系统调用 execvp()fork() 来运行通过命令行参数给出的 shell 命令。这里 arglist 是一个二维数组,其中包含命令名称及其参数列表。我将命令名称作为第一个参数传递,将 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;
}

最佳答案

您没有为该命令分配足够的空间

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。

关于c - execvp 不适用于命令行参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25572041/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com