LSLionjujuyaya 2024-06-23 18:19 采纳率: 0%
浏览 1

基于Fuse的用户态文件系统

在这个文件中基于Fuse的用户态文件系统

    int main(int argc, char* argv[])
    {
        umask(0);
        return fuse_main(argc, argv, &xmp_oper, NULL);
    }


    static int xmp_getattr(const char* path, struct stat* stbuf)//类似start()
    {
        int res;

        res = lstat(path, stbuf);
        if (res == -1)
            return -errno;//返回错误信息,没有该文件或目录

        return 0;//执行成功返回0
    }

    static int xmp_fgetattr(const char* path, struct stat* stbuf,
        struct fuse_file_info* fi)
    {
        int res;

        (void)path;

        res = fstat(fi->fh, stbuf);
        if (res == -1)
            return -errno;//返回错误信息,没有该文件或目录

        return 0;//执行成功返回0
    }



    struct xmp_dirp {//读取目录内容
        DIR* dp;
        struct dirent* entry;
        off_t offset;
    };

    static int xmp_opendir(const char* path, struct fuse_file_info* fi)
    {
        int res;
        struct xmp_dirp* d = malloc(sizeof(struct xmp_dirp));
        if (d == NULL)
            return -ENOMEM;

        d->dp = opendir(path);
        if (d->dp == NULL) {
            res = -errno;
            free(d);
            return res;
        }
        d->offset = 0;
        d->entry = NULL;

        fi->fh = (unsigned long)d;
        return 0;
    }

    static inline struct xmp_dirp* get_dirp(struct fuse_file_info* fi)
    {
        return (struct xmp_dirp*)(uintptr_t)fi->fh;
    }

    static int xmp_readdir(const char* path, void* buf, fuse_fill_dir_t filler,
        off_t offset, struct fuse_file_info* fi)
    {
        struct xmp_dirp* d = get_dirp(fi);

        (void)path;
        if (offset != d->offset) {
            seekdir(d->dp, offset);
            d->entry = NULL;
            d->offset = offset;
        }
        while (1) {
            struct stat st;
            off_t nextoff;

            if (!d->entry) {
                d->entry = readdir(d->dp);
                if (!d->entry)
                    break;
            }

            memset(&st, 0, sizeof(st));
            st.st_ino = d->entry->d_ino;
            st.st_mode = d->entry->d_type << 12;
            nextoff = telldir(d->dp);
            if (filler(buf, d->entry->d_name, &st, nextoff))
                break;

            d->entry = NULL;
            d->offset = nextoff;
        }

        return 0;
    }


    static int xmp_mkdir(const char* path, mode_t mode)//创建目录
    {
        int res;

        res = mkdir(path, mode);
        if (res == -1)
            return -errno;

        return 0;
    }

    static int xmp_unlink(const char* path)//删除文件
    {
        int res;

        res = unlink(path);
        if (res == -1)
            return -errno;

        return 0;
    }

    static int xmp_rmdir(const char* path)//删除目录
    {
        int res;

        res = rmdir(path);
        if (res == -1)
            return -errno;

        return 0;
    }


    static int xmp_rename(const char* from, const char* to)//重命名文件(可选,非必需)
    {
        int res;

        res = rename(from, to);
        if (res == -1)
            return -errno;

        return 0;
    }


    static int xmp_chmod(const char* path, mode_t mode)//修改文件权限
    {
        int res;

        res = chmod(path, mode);
        if (res == -1)
            return -errno;

        return 0;
    }

    static int xmp_chown(const char* path, uid_t uid, gid_t gid)//修改文件属主
    {
        int res;

        res = lchown(path, uid, gid);
        if (res == -1)
            return -errno;

        return 0;
    }

    static int xmp_truncate(const char* path, off_t size)//修改文件大小(可选)
    {
        int res;

        res = truncate(path, size);
        if (res == -1)
            return -errno;

        return 0;
    }

    static int xmp_ftruncate(const char* path, off_t size,
        struct fuse_file_info* fi)
    {
        int res;

        (void)path;

        res = ftruncate(fi->fh, size);
        if (res == -1)
            return -errno;

        return 0;
    }

#ifdef HAVE_UTIMENSAT
    static int xmp_utimens(const char* path, const struct timespec ts[2])//修改文件访问/修改时间(可选)
    {
        int res;

        /* don't use utime/utimes since they follow symlinks */
        res = utimensat(0, path, ts, AT_SYMLINK_NOFOLLOW);
        if (res == -1)
            return -errno;

        return 0;
    }
#endif

    static int xmp_create(const char* path, mode_t mode, struct fuse_file_info* fi)
    {
        int fd;

        fd = open(path, fi->flags, mode);
        if (fd == -1)
            return -errno;

        fi->fh = fd;
        return 0;
    }

    static int xmp_open(const char* path, struct fuse_file_info* fi)
    {
        int fd;

        fd = open(path, fi->flags);
        if (fd == -1)
            return -errno;

        fi->fh = fd;
        return 0;
    }

    static int xmp_read(const char* path, char* buf, size_t size, off_t offset,//打开文件读取数据
        struct fuse_file_info* fi)
    {
        int res;

        (void)path;
        res = pread(fi->fh, buf, size, offset);
        if (res == -1)
            res = -errno;

        return res;
    }

    static int xmp_read_buf(const char* path, struct fuse_bufvec** bufp,
        size_t size, off_t offset, struct fuse_file_info* fi)
    {
        struct fuse_bufvec* src;

        (void)path;

        src = malloc(sizeof(struct fuse_bufvec));
        if (src == NULL)
            return -ENOMEM;

        *src = FUSE_BUFVEC_INIT(size);

        src->buf[0].flags = FUSE_BUF_IS_FD | FUSE_BUF_FD_SEEK;
        src->buf[0].fd = fi->fh;
        src->buf[0].pos = offset;

        *bufp = src;

        return 0;
    }

    static int xmp_write(const char* path, const char* buf, size_t size,//将数据写入文件
        off_t offset, struct fuse_file_info* fi)
    {
        int res;

        (void)path;
        res = pwrite(fi->fh, buf, size, offset);
        if (res == -1)
            res = -errno;

        return res;
    }

    static int xmp_write_buf(const char* path, struct fuse_bufvec* buf,
        off_t offset, struct fuse_file_info* fi)
    {
        struct fuse_bufvec dst = FUSE_BUFVEC_INIT(fuse_buf_size(buf));

        (void)path;

        dst.buf[0].flags = FUSE_BUF_IS_FD | FUSE_BUF_FD_SEEK;
        dst.buf[0].fd = fi->fh;
        dst.buf[0].pos = offset;

        return fuse_buf_copy(&dst, buf, FUSE_BUF_SPLICE_NONBLOCK);
    }

    /*注册上面定义的函数*/
    static struct fuse_operations xmp_oper = {
        .getattr = xmp_getattr,
        .fgetattr = xmp_fgetattr,
        .opendir = xmp_opendir,
        .readdir = xmp_readdir,
        .releasedir = xmp_releasedir,
        .mkdir = xmp_mkdir,
        .unlink = xmp_unlink,
        .rmdir = xmp_rmdir,
        .rename = xmp_rename,
        .chmod = xmp_chmod,
        .chown = xmp_chown,
        .truncate = xmp_truncate,
        .ftruncate = xmp_ftruncate,
    #ifdef HAVE_UTIMENSAT
        .utimens = xmp_utimens,
    #endif
        .create = xmp_create,
        .open = xmp_open,
        .read = xmp_read,
        .read_buf = xmp_read_buf,
        .write = xmp_write,
        .write_buf = xmp_write_buf,

};

这一块代码中,为什么我用VS编译会大量报错,能不能给我头文件以及编译所用的软件

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-06-23 18:19
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    在Visual Studio (VS) 中编译基于FUSE的用户态文件系统时遇到大量错误,可能的原因有:

    1. 缺少FUSE库和头文件:FUSE(Filesystem in Userspace)是一个允许程序在用户空间创建文件系统的框架。编译基于FUSE的程序需要FUSE的开发库和头文件。

    2. 编译器和库版本不兼容:VS可能不支持某些FUSE库的特性,或者库的版本与VS不兼容。

    3. 缺少必要的编译器选项:编译FUSE程序可能需要特定的编译器选项或定义。

    4. 代码中的错误:代码本身可能存在语法错误或不符合VS编译器的要求。

    为了解决这些问题,你可以按照以下步骤操作:

    • 安装FUSE库:你需要安装FUSE库。对于Windows系统,你可以使用DosFUSEWinFsp。这些库提供了在Windows上实现FUSE的功能。

    • 获取头文件:安装FUSE库后,相应的头文件通常位于安装目录的include文件夹中。

    • 配置VS:确保VS的包含路径(Include Directories)设置正确,指向FUSE头文件的位置。同时,确保库路径(Library Directories)设置正确,指向FUSE库文件的位置。

    • 使用CMake:CMake是一个跨平台的自动化构建系统,它可以生成适用于VS的解决方案文件。如果你的项目使用CMake,确保CMake配置正确,并且生成了适用于VS的项目文件。

    • 检查代码:检查代码是否有语法错误或不兼容的C语言特性。

    提供的C语言代码片段定义了与FUSE交互的函数和结构体。以下是一些关键点:

    • xmp_getattrxmp_fgetattr:这些函数用于获取文件或目录的属性。

    • xmp_opendirxmp_readdir:这些函数用于打开目录并读取其内容。

    • xmp_mkdirxmp_unlinkxmp_rmdir 等:这些函数实现了创建目录、删除文件或目录等操作。

    • xmp_oper 结构体:这是一个包含上述函数指针的结构体,用于注册FUSE操作。

    • fuse_main 函数:这是FUSE库的入口点,用于启动FUSE并处理文件系统操作。

    为了更深入地理解FUSE和这些函数的工作原理,你可以查看FUSE的官方文档和教程。这里是一些有用的资源:

    希望这些信息能帮助你解决问题。如果你需要进一步的帮助,请随时提问。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月23日

悬赏问题

  • ¥15 idea自动补全键位冲突
  • ¥15 iis10中如何阻止别人网站重定向到我的网站
  • ¥15 滑块验证码移动速度不一致问题
  • ¥15 定制ai直播实时换脸软件
  • ¥100 栈回溯相关,模块加载后KiExceptionDispatch无法正常回溯了
  • ¥15 Utunbu中vscode下cern root工作台中写的程序root的头文件无法包含
  • ¥15 麒麟V10桌面版SP1如何配置bonding
  • ¥15 Marscode IDE 如何预览新建的 HTML 文件
  • ¥15 K8S部署二进制集群过程中calico一直报错
  • ¥15 java python或者任何一种编程语言复刻一个网页