getresuid 在 c99 中是不是已弃用?

Posted

技术标签:

【中文标题】getresuid 在 c99 中是不是已弃用?【英文标题】:Is getresuid deprecated in c99?getresuid 在 c99 中是否已弃用? 【发布时间】:2015-04-27 06:16:36 【问题描述】:

我正在尝试编译一个包含对getresuid 的调用的函数。但是它会产生以下警告:

setuid.c:8:3: warning: implicit declaration of function 'getresuid' is invalid
in C99 [-Wimplicit-function-declaration]
getresuid(&ruid, &euid, &suid);
^

Undefined symbols for architecture x86_64:
"_getresuid", referenced from:
_main in setuid-ba46f8.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1

为什么会出现链接器错误,提示找不到体系结构 x86_64 的符号?如何让它成功链接?

如果有帮助,我的原始代码是:

#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main() 
    uid_t euid, ruid, suid;
    getresuid(&ruid, &euid, &suid);
    printf("EUID: %d, RUID: %d, SUID: %d\n", euid, ruid, suid);
    return 0;

我正在尝试在 Mac OS X 10.10.2 (Yosemite) 上编译。

【问题讨论】:

直接回答是“不;getresuid() 根本不是 C99 的一部分,也不是 POSIX 2008 (2013) 的一部分”。因此,要使用它,您必须使用特定于平台的扩展。您的代码中不需要#include &lt;sys/types.h&gt;。您的代码在 Ubuntu 14.04 上为我编译好。您使用的是哪个版本的 Linux? 我认为 C99 禁止隐式声明,而不是 getresuid(),这会导致混淆。 @Jonathan Leffler:Mac OS 10.10.2?抱歉,这可能是个愚蠢的问题,但您需要什么扩展(以及在哪里可以找到参考资料)? Mac OS X 10.10.2 不是 Linux 的变体;它是 BSD 的变体。 getresuid() 函数在 Mac 上根本不可用——它没有实现。您需要使用getuid()geteuid() 来表示“r”和“e”部分;我不确定有没有办法得到's'部分。请注意,在问题中准确识别平台将有助于避免陷入各种死胡同。 【参考方案1】:

您需要在所有标题之前定义

#define _GNU_SOURCE

getresuid 是一个 GNU 扩展函数。

【讨论】:

我在原始代码中做到了这一点。它仍然给出同样的错误。 @cathy:- 您是否尝试在 GCC 选项中添加 -D_GNU_SOURCE?还要确保在文件中的所有标题之前添加了#define _GNU_SOURCE 是的。我确实阅读了另一篇建议所有这些事情的 SO 帖子。我相信我上面的错误的主要区别是链接器错误。相关的 SO 帖子是这样的:***.com/questions/19721810/… @cathy:当您定义_GNU_SOURCE 时,您是否收到了编译警告,或者只是链接器错误? 两者。 gcc setuid.c 产生以下结果:【参考方案2】:

直接的答案是“不;getresuid() 根本不是 C99 的一部分——也不是 POSIX 2008 (2013)”。所以要使用它,你必须使用特定于平台的扩展,而且它并非在所有平台上都可用。

顺便说一句,您的代码中不需要#include &lt;sys/types.h&gt;

您的代码在 Ubuntu 14.04 上编译正常。但是,它无法在源自 BSD 而不是 Linux 的 Mac OS X 10.10.3 (Yosemite) 上编译。 getresuid() 函数在平台上根本不可用——未实现。

您需要使用getuid()geteuid() 来获取“r”(真实UID)和“e”(有效UID)信息;我认为没有一种明智的方式来获取“s”(保存的 UID)信息。大多数时候,三个 UID 值是相同的。只有期望以 'setuid' 位集运行的程序需要担心这些,并且此类程序可能需要担心保存的 UID。但是,您可能仅限于在程序启动时检查有效的 UID;这是保存的 UID。

【讨论】:

以上是关于getresuid 在 c99 中是不是已弃用?的主要内容,如果未能解决你的问题,请参考以下文章

“接受接口”是不是会破坏弃用工具?

EditText系列:singleLine已弃用怎么办?

如何处理库中的函数弃用?

正在显示弃用警告“不推荐使用 server/replset/mongos/db 选项”

正在显示弃用警告“不推荐使用 server/replset/mongos/db 选项”

iOS:UDID 已弃用... MAC 地址?