C程序中如何将stat函数获取的User Id转换为用户名?
把文件用户ID转换为用户名的解决方案
你可以使用**getpwuid()**函数来实现这个需求,它能将用户ID(UID)映射到对应的用户信息,包括用户名。这个函数定义在<pwd.h>头文件中。
函数说明
getpwuid()接收一个uid_t类型的用户ID作为参数,返回一个指向struct passwd结构体的指针,该结构体包含了用户的详细信息,其中pw_name字段就是我们需要的用户名。如果找不到对应的用户,函数会返回NULL,同时设置errno。
修改后的代码
我们来调整你的代码,加入getpwuid()的使用和错误处理:
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <errno.h> #include <pwd.h> // 新增头文件 int main(int argc, char **argv){ struct stat st; struct passwd *pwd; for(int i=1; i<argc; i++){ int t = stat(argv[i], &st); if(t != 0){ perror("stat"); return 1; } pwd = getpwuid(st.st_uid); if(pwd == NULL){ // 如果找不到对应用户,打印UID并提示 printf("%s %d (unknown user)\n", argv[i], st.st_uid); } else { printf("%s %s\n", argv[i], pwd->pw_name); } } return 0; }
线程安全的替代方案
如果你的程序运行在多线程环境,推荐使用**getpwuid_r()**函数——它是getpwuid()的线程安全版本,需要你自己提供缓冲区来存储用户信息:
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <errno.h> #include <pwd.h> #include <stdlib.h> int main(int argc, char **argv){ struct stat st; struct passwd pwd; struct passwd *result; char *buf; size_t buf_size; // 获取合适的缓冲区大小,失败则用备用值 buf_size = sysconf(_SC_GETPW_R_SIZE_MAX); if(buf_size == -1){ buf_size = 16384; } buf = malloc(buf_size); if(buf == NULL){ perror("malloc"); return 1; } for(int i=1; i<argc; i++){ int t = stat(argv[i], &st); if(t != 0){ perror("stat"); free(buf); return 1; } int err = getpwuid_r(st.st_uid, &pwd, buf, buf_size, &result); if(result == NULL){ if(err == 0){ printf("%s %d (unknown user)\n", argv[i], st.st_uid); } else { perror("getpwuid_r"); free(buf); return 1; } } else { printf("%s %s\n", argv[i], pwd.pw_name); } } free(buf); return 0; }
注意事项
- 编译时无需额外链接库,
getpwuid()和getpwuid_r()已包含在标准C库中。 - 若系统存在无对应用户名的UID(比如部分系统服务的UID),要做好错误处理,避免程序崩溃。
内容的提问来源于stack exchange,提问作者Todor Dimitrov
相关产品推荐
相关产品推荐

