繁体   English   中英

execvp无法与命令行参数一起使用

[英]execvp not working with command line argument

我正在此程序上运行,以使用系统调用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;
}

您这样做时没有为命令分配足够的空间

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]);

并删除所有malloc,除了为arglist本身创建空间的malloc。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM