【问题标题】:I am working on creating my own UNIX shell and some times when I run 'ls' command it gives an error bad address我正在创建自己的 UNIX shell,有时当我运行“ls”命令时,它会给出错误错误地址
【发布时间】:2018-11-23 09:09:42
【问题描述】:

我想知道 execvp 调用 ls 是否有错误可能导致它偶尔失败,然后在其他时候正常工作。

void lookInsideCurrentDirectory(char **parsed){
    char* line = NULL;
    pid_t pid = fork();

    if(pid == -1){
        return;
    }
    else if(pid == 0){
        if(execvp(parsed[0], parsed) == -1){
            perror("Error: ");
        }
        exit(0);
    }
    else{
        wait(NULL); 
        return;
    }
}

【问题讨论】:

  • 你遇到了什么错误?
  • 您的parsed 可能不好。你应该展示你是如何获得它的。
  • 我得到的错误是“错误地址”@LieRyan

标签: c shell unix


【解决方案1】:

根据https://www.gnu.org/software/libc/manual/html_node/Error-Codes.html

Macro: int EFAULT

    “Bad address.” An invalid pointer was detected.

如果您从 execvp 收到此错误,则表示 parsed 中的某些指针无效。您应该查看程序的其余部分,并确保在 execvp 调用完成之前,parsed 数组中的任何字符串都不是 free()-ed。

另一个非常常见的错误是,由于您没有将参数数组的长度传递给 execvp,argv 参数必须是一个以 NULL 结尾的数组,以便 execvp 知道何时停止读取参数。这意味着如果您收到如下命令:ls -lah /bin,那么您的 argv 数组应该更大,并以 NULL 指针结束:

char** argv = {"ls", "-lah", "/bin", NULL};

如果你没有以 NULL 指针结束 argv,execvp 将尝试取消引用内存中接下来的任何内容作为指针地址,除非它恰好包含 NULL 字节,否则取消引用可能会失败或取消引用出乎意料的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    相关资源
    最近更新 更多