C Unix编程。不确定如何使用passwd结构

C Unix编程。不确定如何使用passwd结构,c,unix,passwd,C,Unix,Passwd,我已经做了一些研究,但我仍在努力解决passwd结构 我需要获得用户ID,但我不认为我使用的是理解它 int getpwuid\u r(uid\u t,结构passwd*,char*,size\u t,结构passwd**) 此方法调用返回一个指向结构的点,该结构将包含我需要的所有数据。我对参数感到相当困惑 结构passwd。我需要先申报吗?结构passwd passwd 我完全不知道怎么用这个 最后,一旦我填满指针。我将使用什么调用来获取数据?感谢您的帮助。在getpwuid\r签名中: i

我已经做了一些研究,但我仍在努力解决passwd结构

我需要获得用户ID,但我不认为我使用的是理解它

int getpwuid\u r(uid\u t,结构passwd*,char*,size\u t,结构passwd**)

此方法调用返回一个指向结构的点,该结构将包含我需要的所有数据。我对参数感到相当困惑

结构passwd。我需要先申报吗?结构passwd passwd

我完全不知道怎么用这个


最后,一旦我填满指针。我将使用什么调用来获取数据?感谢您的帮助。

getpwuid\r
签名中:

int getpwuid_r(uid_t uid, struct passwd *pwbuf, char *buf, 
    size_t buflen, struct passwd **pwbufp);
uid
是一个输入参数-它是您要查找的用户的uid。其余的基本上是输出参数:
pwbuf
指向的结构将填充密码信息,如果调用成功,则
pwbufp
指向的指针将设置为
pwbuf
的值(如果调用不成功,则设置为
NULL
)。
buf
buflen
对参数指定一个用户提供的缓冲区,用于存储返回的
struct passwd
结构的成员指向的字符串

您可以这样使用它(这将查找UID为101的用户):


如果您想按名称查找用户以查找其ID,请使用
getpwnam_r
并检查返回结构的
pw_uid
字段。

好的,首先,我不太确定您试图实现什么-您说需要获取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);
函数的作用是:返回一个指针,指向一个结构,该结构包含密码数据库中与用户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\u r,对于更仔细的错误处理和内存管理来说更好,但是如果您只需要快速查找,这应该很好。

首先,如果您想要获取UID,那么您可能手头有用户名,在这种情况下,您应该使用
getpwnam\u r()
。此函数的使用方式与
getpwuid\u r()
完全相同,只是将名称(
char*)
作为第一个参数传递给它

其次,您不需要声明'struct passwd'。当您包括pwd.h

第三,函数的确切签名是:

int getpwnam_r(const char *name, struct passwd *pwd,
               char *buf, size_t buflen, struct passwd **result);
在上面,pwd是一个输出参数。如果找到密码条目,函数将在此处返回密码条目

最后,有一个完整的示例,说明如何在Linux
getpwnam_r
手册页中使用
getpwnam_r
,可访问


:这里

不错,我用的是getpwuid,你用的是getpwuid\r。希望OP寻找的答案就是其中之一!我感谢所有人提供的帮助。我现在应该没事了。有人以不同的方式向我解释了这一点,而我最初是在正确的道路上开始的。如果您想知道,我有一个unix编程项目,需要显示其目录中所有文件的所有用户权限。不,
pwd
不是输出参数,而是指向存储结果数据的内存的指针
result
是一个输出参数,它将指向
pwd
(找到条目时)或
0
(未找到条目时)
pwd
buf
只是为函数提供存储数据的内存,避免函数
getpwnam_r
不得不分配内存本身。
int getpwnam_r(const char *name, struct passwd *pwd,
               char *buf, size_t buflen, struct passwd **result);