【问题标题】:Show owner name of a file in C在 C 中显示文件的所有者名称
【发布时间】:2014-07-13 19:52:25
【问题描述】:

我正在执行 ls 命令,并且现在正在执行 -l 选项。楼主的名字有点问题。它总是打印 id 而不是 name。

这是我的功能:

void print_user_ID(char* filepath) {
    struct stat sb;
    struct passwd pwent;  
    struct passwd *pwentp;
    char buf[_SC_GETPW_R_SIZE_MAX];

    if(stat(filepath, &sb) == -1) {
        perror("stat"); 
    }

    if (!getpwuid_r(sb.st_uid, &pwent, buf, sizeof(buf), &pwentp))  
        printf("%10s ", pwent.pw_name);  
    else  
        printf("%7d ", sb.st_uid);  
}

你知道我的错误在哪里吗?

【问题讨论】:

  • 如果getpwuid_r()返回非零值,请查看errno了解详情
  • _SC_GETPW_R_SIZE_MAX 更改为更大的数字。 _SC_GETPW_R_SIZE_MAX 应该在sysconf() 函数中用于获取缓冲区大小。此外,只有当stat 成功时,您才应该调用getpwuid_r()
  • getpwuid_r() 可重入需要malloced 内存,该内存可以reallocated。将 pwent 更改为指针,然后为其分配内存并将 pwentp 更改为指向 pwent 的地址。总之,它应该看起来像getpwuid_r(sb.st_uid, pwent, buf, sizeof(buf), &pwent),其中pwent 是一个分配了内存的指针。

标签: c unix implementation ls


【解决方案1】:

有时getpwuidgetgruid 会失败,修复它只需将itoa 改为st_uid 即可修复:D

像这样:

struct passwd   *pw;
struct group    *gr; 
if ((pw = getpwuid(st.st_uid)))
    (!arg->g) ? printf("%s", pw->pw_name) : NULL;
else
    (!arg->g) ? printf("%s", itoa(st.st_uid)) : NULL;

【讨论】:

  • itoa() 不可移植。不仅如此,您发布的版本不是可重入的,而原始问题使用可重入getpwent_r(),大概是为了提供可重入实现。原来的问题已经用printf() 正确处理了这个问题 - itoa() 完全是多余的。
【解决方案2】:

Alok Singhal 的评论回答了我的问题。我不得不将 _SC_GETPW_R_SIZE_MAX 更改为更大的数字。

【讨论】:

  • 你可能想接受你自己的答案,所以现在这个问题得到了回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-25
  • 1970-01-01
  • 1970-01-01
  • 2015-04-18
相关资源
最近更新 更多