execvp失败多个或没有参数

时间:2013-12-09 01:05:53

标签: c shell arguments exec execvp

我正在研究C中一个非常基本的UNIX shell。在这个项目中,我试图使用fork()execvp()来执行实际的shell命令。我遇到了一个问题,它似乎可以使用具有单个参数的命令(例如ls -lecho howareyoutoday完美地工作),但具有多个参数的命令无法执行({ {1}}没有运行)。我将引导您完成我的代码/基本原理,以帮助找出导致此问题的原因。

echo how are you today

因此,它开始时会进行基本 char *token; int count=0; pid_t childProc; int childStatus; pid_t tpid; char* argv[256]; int i=1; childProc = fork(); if (childProc==0) { //CHILD PROCESS IS HERE argv[0] = malloc(strlen(token)); argv[0] = token; token=strtok(NULL," \n\t()<>|&;"); while(token!=NULL) { argv[i]=malloc(strlen(token)); argv[i]=token; token=strtok(NULL," \n\t()<>|&;"); i++; } execvp(argv[0],argv); //if this executes execvp fails printf("failure to execute\n"); i=0; exit(0); } else { //PARENT PROCESS IS HERE do { tpid = wait(&childStatus); } while(tpid != childProc); } 调用以创建子进程。在该子进程中,我为fork()数组中的第一个元素分配内存。来自之前argv来电的token已分配给strtok。生成新的argv[0]并将其添加到下一个token元素中。对剩余的令牌重复该过程。

完成argv数组后,将调用argv,第一个参数包含命令名称,第二个参数包含整个execvp数组。如果命令执行失败,将返回argv并显示一条消息,表明将打印该文件。

我无法弄清楚为什么我遇到上面提到的多个参数问题。任何帮助或建议将不胜感激!

作为参考,完整程序的代码如下:

execvp

1 个答案:

答案 0 :(得分:1)

您需要将参数字符串终止为execvp

if (childProc == 0)
{
    argv[0] = malloc(strlen(token));
    argv[0] = token;

    token = strtok(NULL, " \n\t()<>|&;");

    while (token != NULL)
    {
        argv[i] = malloc(strlen(token));
        argv[i] = token;
        token = strtok(NULL, " \n\t()<>|&;");
        i++;
    }

    argv[i] = NULL;  //<--- insert here

    if (execvp(argv[0], argv) == -1)
    {
        printf("failure to execute because %s\n", strerror(errno));
        exit(0);
    }
}