我正在创建自己的UNIX shell,有时当我运行'ls'命令时,它会给出错误的错误地址

Pat*_*ion 1 c unix shell

我想知道是否有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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Lie*_*yan 5

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

Macro: int EFAULT

    “Bad address.” An invalid pointer was detected.
Run Code Online (Sandbox Code Playgroud)

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

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

char** argv = {"ls", "-lah", "/bin", NULL};
Run Code Online (Sandbox Code Playgroud)

如果不使用NULL指针结束argv,execvp将尝试取消引用内存中接下来作为指针地址的任何内容,除非它恰好包含NULL字节,否则derefence可能会失败或可能取消引用意外事物.