正如标题所示,我在调用execve()时遇到“Bad Address”错误。每当我发现其他人遇到同样的问题时,他们只是在数组的末尾省略了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;
}
答案 0 :(得分:2)
根据您的代码,ssock
是一个整数,一个文件描述符,因为您在默认情况下(父级)将其传递给close()
。
但是,您还将该整数作为字符指针传递给参数列表中的execve
(在子情况下)。这样的整数不太可能映射到有效的内存地址,因此您的错误。实际上,即使它确实映射到有效地址,程序也很可能会崩溃,因为该地址可能不包含有效字符串;至少,你会得到意想不到的结果。