gpt4 book ai didi

C sys/stat.h 并非 stat 结构的每个字段都被初始化

转载 作者:行者123 更新时间:2023-11-30 17:32:53 26 4
gpt4 key购买 nike

我最近一直在尝试实现我自己的 linux ls 命令版本。一切都很好,但是当我尝试使用 ls -l 功能时,struct stat 的某些字段未初始化 - 我得到 NULL 指针或垃圾值,尽管它似乎只发生在某些文件和目录中,就像/的内容一样和其他属于根或根组的。我觉得奇怪的是,文件的写权限总是成功的。这是错误函数的代码:

void printFullList(struct dirent* pDirEnt) {
struct stat fileStat;
stat(pDirEnt->d_name, &fileStat);
if(pDirEnt->d_type & DT_DIR)
putchar('d');
else
putchar('-');

putchar((fileStat.st_mode & S_IRUSR) ? 'r' : '-');
putchar((fileStat.st_mode & S_IWUSR) ? 'w' : '-');
putchar((fileStat.st_mode & S_IXUSR) ? 'x' : '-');
putchar((fileStat.st_mode & S_IRGRP) ? 'r' : '-');
putchar((fileStat.st_mode & S_IWGRP) ? 'w' : '-');
putchar((fileStat.st_mode & S_IXGRP) ? 'x' : '-');
putchar((fileStat.st_mode & S_IROTH) ? 'r' : '-');
putchar((fileStat.st_mode & S_IWOTH) ? 'w' : '-');
putchar((fileStat.st_mode & S_IXOTH) ? 'x' : '-');

struct passwd *pwd;
pwd = getpwuid(fileStat.st_uid);
struct group *gid = NULL;
gid = getgrgid(fileStat.st_gid);
char date[15];
strftime(date, 15, "%d-%m %H:%M", localtime(&(fileStat.st_ctime)));
printf(" %d %s %s %5d %s %s\n", (int)fileStat.st_nlink, (pwd != NULL ? pwd->pw_name : "NO_PERM"), (gid != NULL ? gid->gr_name : "NO_PERM"), (int)fileStat.st_size, date, pDirEnt->d_name);
}

感谢您的帮助!

编辑:

stat() 返回 -1。我在每次函数调用之前将 errno 设置为 0。正如 @chux 建议的那样,我每次都会打印 pDirEnt->d_name 。这是/的输出:

mnt No such file or directory d---rw---- 16961624 root NO_PERM 1 27-03 08:13 mnt
usr No such file or directory d--x--x--- 16961648 root NO_PERM 1 27-03 08:13 usr
root No such file or directory d--xr----- 16961672 root NO_PERM 1 27-03 08:13 root
lost+found No such file or directory d-w------- 16961696 root NO_PERM 1 27-03 08:13 lost+found ...

最佳答案

stat() returns -1

当系统调用返回错误指示时,您期望的任何数据(例如 fileStat)都可能产生一些有效数据或纯垃圾。

将程序的输出与 ls -l 进行比较,您会发现权限和文件大小毫无意义。

关于C sys/stat.h 并非 stat 结构的每个字段都被初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23963893/

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