直接调用stat()获取st_uid是最轻量可靠的方式,返回数值型UID而非用户名;需包含<sys/stat.h>、检查返回值,失败时errno指示原因;查用户名须用线程安全的getpwuid_r()并妥善处理缓冲区与错误。

Linux下用stat()读取文件用户ID
直接调用stat()系统调用是最可靠的方式,它返回的struct stat里有st_uid字段,就是文件所属用户的数值ID。注意这不是用户名,而是UID整数。
- 需要包含头文件:
#include <sys/stat.h> - 调用后检查返回值是否为0,失败时
errno会设为对应错误(比如ENOENT表示文件不存在) -
st_uid是uid_t类型,通常可直接转成int打印,但不要假设它总是int - 如果要查用户名而非UID,得额外调用
getpwuid(),且该函数不是线程安全的;现代代码推荐用getpwuid_r()
C++17不支持直接获取文件所有者名
std::filesystem::status()能拿到权限、大小、最后修改时间,但file_status里没有用户或组信息——这是标准库故意省略的,因为跨平台无法统一语义。Windows没有UID/GID概念,macOS和Linux实现也不同。
- 在Linux/macOS上,必须绕过
std::filesystem,走POSIX系统调用 - 别试图用
std::filesystem::path拼接出“所有者”字段,它根本不存在 - 某些第三方库(如Boost.Filesystem)也未暴露UID接口,同样得回退到
stat()
获取用户名需额外查/etc/passwd或NSS
有了st_uid,想转成字符串形式的用户名(比如"alice"),就得查用户数据库。直接读/etc/passwd简单但不可靠:容器环境可能没这个文件,LDAP/NIS用户也不会出现在里面。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 优先用
getpwuid_r(),传入缓冲区避免内存分配和竞态 - 若返回
ERANGE,说明缓冲区太小,需重试并扩大缓冲区 - 返回
NULL且errno == 0表示UID不存在(比如被删掉的用户),此时应按UID数字显示,而非崩溃或空字符串 - Windows平台无对应机制,
GetFileSecurity()返回的是SID,和Unix用户名完全不是一回事
权限不足时stat()会失败,别忽略错误码
即使文件存在,也可能因权限不够而无法读取元数据——常见于其他用户home目录下的文件,或者设置了特殊ACL。此时stat()返回-1,errno通常是EACCES或EPERM。
立即学习“C++免费学习笔记(深入)”;
- 不能把失败当作“用户未知”,必须显式处理并反馈错误原因
- 某些场景(如日志分析工具)需要静默跳过,但至少记录
errno值用于调试 - root用户能绕过大部分权限检查,但CAP_DAC_OVERRIDE等能力也要看内核配置,并非绝对可靠
stat()拿UID,再getpwuid_r()查名字,中间任何一步失败都要单独应对。跨平台程序干脆只显示UID,反而更稳定。

















