C Unix编程。不确定如何使用passwd结构
我已经做了一些研究,但我仍在努力解决passwd结构 我需要获得用户ID,但我不认为我使用的是理解它 int getpwuid\u r(uid\u t,结构passwd*,char*,size\u t,结构passwd**) 此方法调用返回一个指向结构的点,该结构将包含我需要的所有数据。我对参数感到相当困惑 结构passwd。我需要先申报吗?结构passwd 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
最后,一旦我填满指针。我将使用什么调用来获取数据?感谢您的帮助。在
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是一个输出参数。如果找到密码条目,函数将在此处返回密码条目
最后,有一个完整的示例,说明如何在Linuxgetpwnam_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);