質問
このコード:
#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()関数と同じ方法で返されます。
mode = 16704 (S_IFDIR | S_IRUSR | S_IXUSR) size = 0
しかし、私がそれを実行するとき sudo
, 、それはこれを返します:
mode = 16832 (S_IFDIR | S_IRWXU) size = 4096
何が起こるのですか?使用する場合 stat()
と sudo
それは私に与えます アクセス拒否 エラー。これはでのみ発生します .gvfs
ディレクトリ、その権限は500(DR-X ------)です。もしも sudo
で読めない stat()
、なぜそれが機能するのか nftw()
? :|
解決
おそらく起こっているのは、統計がディレクトリで失敗したことですが、統計構造の値を印刷していることです。つまり、ゴミを取得します。 statが統計構造を正常に設定していることを確認するために、NFTW_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;
}
所属していません StackOverflow