好的,首先,我不太确定您要完成什么 - 您说您需要获取 uid,但 getpwuid 是用于根据 uid 查找其他信息。您是否想要根据用户名查找的 getpwnam?然后你需要将uid用于另一个功能吗?
无论如何,我在下面所说的一切都适用于 getpwnam 和 getpwuid - 只需将 uid 参数换成 username 参数即可。
你把你的文档弄混了一点。来自手册页的几乎引用:
struct passwd *getpwuid(uid_t uid);
int getpwuid_r(uid_t uid, struct passwd *pwbuf, char *buf, size_t buflen, struct passwd **pwbufp);
getpwuid() 函数返回一个指向结构的指针,该结构包含密码数据库中与用户 ID uid 匹配的记录的断开字段。
getpwuid_r() 函数获取相同的信息,但将检索到的 passwd 结构存储在 pwbuf 指向的空间中。
听起来你一般对指针有点模糊。但是,您不必为这项工作担心太多,对于您的目的来说,更简单的版本可能会很好:
struct passwd * my_passwd;
my_passwd = getpwuid(uid);
// or:
// my_passwd = getpwnam(username);
if (my_passwd == NULL) {
// the lookup failed - handle the error!
} else {
// the lookup succeeded - do your thing
printf("User name: %s\n", my_passwd->pw_name);
printf("User password: %s\n", my_passwd->pw_passwd);
...
}
请注意,在这种情况下,您不需要为指针分配内存,因为 getpwuid 返回一个指向已分配内存和存储信息的结构的指针。
结构的完整定义(其他成员的名称)在手册页中。
第二种形式 getpwuid_r 更适合更仔细的错误处理和内存管理,但如果您需要做的只是快速查找,这应该没问题。