我正在linux中运行一个C程序,它打印文件名及其用户和组所有权。我使用的是getpwuid
和getgrgid
。
当文件由不存在的用户拥有时(即,/etc/passwd
中我的机器上没有给定UID的条目),我的程序会以&#34;以信号11&#34; <终止而终止。< / p>
如何使我的程序与ls
的行为相同,以便在用户不存在时打印数字UID,而不是segfaulting?
相关的代码段如下:
lstat(filename,&fileStat)
struct group *grp;
struct passwd *pwd;
pwd = getpwuid(fileStat.st_uid);
printf(" %s", pwd->pw_name);
grp = getgrgid(fileStat.st_gid);
printf(" %s", grp->gr_name);
答案 0 :(得分:2)
getpwuid
和getgrgid
会返回NULL
指针。
在访问它之前,您必须检查它不是NULL
以避免段错误。
在使用lstat
之前,您还必须检查fileStat
的返回值,以确保它成功,否则会导致其他段错误。 lstat
在失败时返回-1并设置errno否则为0。
lstat(3)
int ret = lstat(filename,&fileStat)
if(ret == -1){
fprintf(stderr, "lstat: (%s): %s\n", filename, strerror(errno));
return 1;
}
struct group *grp;
struct passwd *pwd;
pwd = getpwuid(fileStat.st_uid);
if(pwd != NULL){
printf(" %s", pwd->pw_name);
}else{
printf(" %ld", (long)fileStat.st_uid);
}
grp = getgrgid(fileStat.st_gid);
if(grp != NULL){
printf(" %s", grp->gr_name);}
else{
printf(" %ld", (long)fileStat.st_gid);
}
getpwuid(3)
有时它可能会在错误上返回NULL指针并设置errno
。在检查特定错误之前,您必须将errno设置为零
答案 1 :(得分:1)
查看手册页GETPWUID(3P)
返回值
getpwuid()函数应返回指向struct passwd的指针 具有匹配条目if中定义的结构 找到。 如果请求的条目不是,则返回空指针 发现,或发生错误。出错时,应将errno设置为指示 错误。
在访问任何内容之前检查空指针,例如
pwd = getpwuid(fileStat.st_uid);
if (pwd) {
printf(" %s", pwd->pw_name);
} else {
// handle non-existing user entry
}