【发布时间】: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