gpt4 book ai didi

c - 当给定 UID 的用户不存在时,getpwuid 和 getgrgid 会导致段错误

转载 作者:太空宇宙 更新时间:2023-11-04 06:56:55 28 4
gpt4 key购买 nike

我在 Linux 中运行一个 C 程序,它打印文件名及其用户和组所有权。我正在使用 getpwuidgetgrgid

当文件由不存在的用户拥有时(即,在我的机器上没有针对给定 UID 的 /etc/passwd 条目),我的程序会出现“由信号 11 终止”的段错误。

我怎样才能使我的程序的行为与 ls 相同,以便它在用户不存在时打印数字 UID,而不是出现段错误?

相关代码片段如下:

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);

最佳答案

如果在/etc/passwd 数据库中找不到用户或出现错误,

getpwuidgetgrgid 将返回一个 NULL 指针。在访问它的值以避免段错误之前,您必须检查它不是 NULL

在使用 fileStat 之前,您还必须检查 lstat 的返回值以确保它成功,否则会导致另一个段错误。 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 设置为零

关于c - 当给定 UID 的用户不存在时,getpwuid 和 getgrgid 会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43173142/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com