gpt4 book ai didi

C:nftw() 的奇怪行为

转载 作者:行者123 更新时间:2023-12-04 06:42:00 27 4
gpt4 key购买 nike

我有这个代码:

#include <ftw.h>
#include <stdio.h>
#include <string.h>

int nftw_stat(const char *path, const struct stat *stat, int flags,
struct FTW *ftw)
{
if (strcmp(path, "/home/pf/.gvfs\0") == 0) {
printf("nftw()\n");
printf("mode = %d\n", stat->st_mode);
printf("size = %d\n", (int) stat->st_size);
}

return 0;
}

int main()
{
if (nftw("/home/pf", &nftw_stat, 1, FTW_PHYS)) {
perror("nftw");
return 2;
}
}

如果我正常执行它,它的返回方式与 stat() 函数相同:

模式 = 16704 (S_IFDIR | S_IRUSR | S_IXUSR)
大小 = 0

但是当我用 sudo 执行它时,它返回这个:

模式 = 16832 (S_IFDIR | S_IRWXU)
大小 = 4096

发生什么了?如果我使用 stat()sudo它给了我权限被拒绝的错误。这只发生在 .gvfs目录,其权限为 500 (dr-x------)。如 sudo无法阅读 stat() ,为什么它适用于 nftw() ? :|

最佳答案

可能发生的情况是目录上的 stat 失败了,但无论如何您都在打印 stat 结构的值,这意味着您得到了垃圾。您需要检查 typeflag 的值,您在 nftw_stat 例程中将其称为“flags”,以确保 stat 已成功设置 stat 结构。

int nftw_stat(const char *path, const struct stat *stat, int typeflag,
struct FTW *ftw)
{
if (typeflag == FTW_NS) {
printf("stat failed on %s\n", path);
return 1;
}
if (strcmp(path, "/home/pf/.gvfs\0") == 0) {
printf("nftw()\n");
printf("mode = %d\n", stat->st_mode);
printf("size = %d\n", (int) stat->st_size);
}
return 0;
}

关于C:nftw() 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4132622/

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