You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:06:20