4

xxx_readdir() in FUSEの実装では、以下のコードを使用します。

static int hello_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
                         off_t offset, struct fuse_file_info *fi)
{
    DIR *dp;
    struct dirent *de;

    (void) offset;
    (void) fi;

    dp = opendir(path);
    if (dp == NULL)
        return -errno;

    while ((de = readdir(dp)) != NULL) {
        struct stat st;
        memset(&st, 0, sizeof(st));
        st.st_ino = de->d_ino;
        st.st_mode = de->d_type << 12;
        if (filler(buf, de->d_name, &st, 0))
            break;
    }

    closedir(dp);
    return 0;
}

次に、フォラーでコンパイルして実行します。

./hello /tmp/hello/

コマンドを使用するls /tmp/hello/と、結果は次のようになります。

bin   dev  home  lib64       media  opt   root  sbin  sys  usr
boot  etc  lib   lost+found  mnt    proc  run   srv   tmp  var

ただし、にファイルまたはディレクトリを作成していません/tmp/hello/lsそれで、私がコマンドを使用するとき、なぜこれらのdirecotiesがそれに存在するのですか?

4

1 に答える 1

5

あなたが呼ぶ:

dp = opendir(path);

実装を開始しますreaddir。これを呼び出すときpathは、システムの絶対パスではなく、ファイルシステムのルートを基準にしています

したがって、/ tmp / hello /では、の値はpath「/」になります。これは、ファイルシステムがマウントされている場所の詳細を知る必要がないためです。そこには意図的な抽象化があり、各ファイルシステムはそれが格納するものだけに関係するようになっています。

于 2012-07-31T06:53:55.537 に答える