execvp遇到问题

时间:2019-03-05 03:14:55

标签: c shell execvp

我在尝试用c编写的基本Shell程序遇到了一些麻烦。每当我尝试在诸如 ls 之类的函数中调用exec时,execvp都会返回一条错误,指出找不到文件或目录。我认为问题在于解析,因为主要是可以打印命令,但在功能上却是空白的。谢谢

以下是该函数的代码:

int extern_process(char *arg[]){
    pid_t pid;
    int errnum, ifFail;
    printf("i%si\n",arg[0]);
    pid = fork();

    if(pid == -1){
        errnum = errno;
        fprintf(stderr,"Error: fork %s", strerror(errnum));
        return FAIL;
    } else if(pid == 0){
        ifFail = execvp(arg[0],arg);
        if(ifFail < 0){
            errnum = errno;
            fprintf(stderr,"Error: exec %s", strerror(errnum));
            return FAIL;
        }
    } else {
        pid = wait(NULL);
    }
    return SUCCESS;
}

这里是解析函数的代码,以防万一:

void parse_cmd(char *retval[], char *cmd){
    char *tmp;
    char a[100];
    strcpy(a,cmd);
    int i = 0;
    tmp = strtok(a," \n\t\0");

    if(retval == NULL){
        fprintf(stderr, "Error with allocation\n");
        return;
    }
    if(tmp == NULL){
        printf("Error with parsing.\n");
        return;
    }
    while(tmp != NULL){
        retval[i] = tmp;
        tmp = strtok(NULL," \n\t\0");
        i++;
    }
    retval[i] = NULL;
}

以下是输出:

shell> ls 
ls
i i 
Error: exec no file or directory found 

1 个答案:

答案 0 :(得分:1)

我很确定strtok返回一个指向第一个参数的指针,在您的情况下,该参数是堆栈分配。我相信,返回指向该堆栈分配的指针数组将导致未定义的行为。这可能是也可能不是您的问题的原因。不了解更多代码就很难知道。要进行测试,请尝试像这样更改代码的这一部分:

void parse_cmd(char *retval[], char *cmd){
    char *tmp;
    char *a = strdup(cmd);
    int i = 0;

在生产中使用它之前,您需要确定一些方法来确保您释放“ a”,否则会泄漏。也许您可以只返回它而不是void并从其他地方释放它,或者实际上可以strdup()每个标记并编写一个函数以释放所有标记或对您有用的任何东西。

如果还有其他问题,则可能在其他代码中。我真的没有发现其他任何错误。