c - execvp 遇到问题

标签 c shell execvp

我在尝试用 c 编写的基本 shell 程序时遇到了一些问题。每当我尝试在 ls 等函数中调用 exec 时,execvp 将返回一条错误,指出找不到文件或目录。我认为问题在于解析,因为在 main 中,可以打印命令,但在函数中它是空白的。谢谢

这是该函数的代码:

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 

最佳答案

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

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

在生产中使用它之前,您需要找到某种方法来确保释放“a”,否则就会发生泄漏。也许您可以返回它而不是 void 并从其他地方释放它,或者您实际上可以 strdup() 每个标记并编写一个函数来释放它们全部或任何适合您的函数。

如果还有其他问题,可能是在其他代码中。我真的没有发现这里有什么问题。

关于c - execvp 遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54994891/

相关文章:

c - Ubuntu 13.04 上的 gcc 编译问题

linux - 定期检查文件夹是否已在目录中创建

node.js - Node.js 中的子进程 stdout 和 stderr 列大小

c - 在构造的字符串上使用 execvp 的问题

c - 如何在 Visual Studio 2005 上检测未引用的 C/C++ 代码?

将 2 字节十六进制数转换回十进制

C - 替换 "No such file or directory"消息

c - exevp 跳过所有代码,直到 c 中的 wait 调用

c - 如何在 Visual Studio 2013 中将 stdint 类型与 _tprintf 一起使用?

shell - 批量重命名子目录中的文件扩展名