c - 执行 "Bad address"错误

标签 c linux execve

如标题所示,我在调用 execve() 时收到“错误地址”错误。每当我发现其他人遇到同样的问题时,他们只是省略了数组末尾的 NULL,但我在这里这样做,但仍然出现错误。有人知道是什么原因造成的吗?

switch(fork()) {
    case 0: //child
        (void) close(msock);
        char *argv[] = {"./echo", (char *)ssock, NULL};
        char *envp[] = {NULL};
        int result = execve(argv[0], argv, envp);
        if (result < 0) {
            err_sys("execve");
        }
    case -1: //error
        err_sys("fork");
        break;
    default: //parent
        (void) close(ssock);
        break;
}

最佳答案

根据您的代码,ssock 是一个整数,一个文件描述符,因为您在默认情况下(父级)将它传递给 close()

但是,您还将该整数作为字符指针传递给参数列表中的 execve(在子情况下)。这样的整数不太可能映射到有效的内存地址,因此您的错误。事实上,即使它确实映射到一个有效地址,程序也很可能会崩溃,因为该地址可能不包含有效字符串;至少,你会得到意想不到的结果。

关于c - 执行 "Bad address"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22286569/

相关文章:

没有循环的 C 程序意外地表现得像一个循环

linux - linux有HOST文件吗?

linux - 为什么fork()在子进程中返回0?

bash - "sh -c"不接受额外参数的问题,UNIX,使用 execve()

c - 执行 execve() 的正确步骤是什么?

c - 使用合并排序对数组进行排序

c - 循环队列中的数组未初始化

c - C 中的链接链表

c - 静态和内联

c - argv、envp、argc(命令行参数)的最大汇总大小始终远离 ARG_MAX 限制