Filesystems 如何在命令行参数中告诉fuse3需要设备和装入点

Filesystems 如何在命令行参数中告诉fuse3需要设备和装入点,filesystems,fuse,Filesystems,Fuse,我正在使用fuse3编写一个文件系统驱动程序,它应该解析所有fuse选项,然后接受两个参数,一个设备路径(或包含文件系统映像的文件)和一个装入点 有没有一种方便的方法可以使用fuse的命令行解析从命令行提取设备?我已经习惯于在将这些论点进行如下融合之前对其进行处理: struct fuse_args args; const char *device = NULL; memset(&args, 0, sizeof(args)); for (int i =

我正在使用fuse3编写一个文件系统驱动程序,它应该解析所有fuse选项,然后接受两个参数,一个设备路径(或包含文件系统映像的文件)和一个装入点

有没有一种方便的方法可以使用fuse的命令行解析从命令行提取设备?我已经习惯于在将这些论点进行如下融合之前对其进行处理:

    struct fuse_args args;
    const char *device = NULL;

    memset(&args, 0, sizeof(args));
    for (int i = 0; i < argc; ++i)
        if (i > 0 && i == argc - 2 && *argv[i] != '-')
            image = argv[i];
        else
            fuse_opt_add_arg(&args, argv[i]);

    if (fuse_opt_parse(&args, &options, option_spec, NULL) == -1)
        return 1;

    if (!device) {
        usage(argv[0]);
        fuse_opt_add_arg(&args, "--help");
    }

    fuse_main(args.argc, args.argv, &oper, nullptr);
struct fuse_args args;
常量字符*设备=空;
memset(&args,0,sizeof(args));
对于(int i=0;i0&&i==argc-2&&*argv[i]!='-'))
image=argv[i];
其他的
熔丝选择添加参数(&args,argv[i]);
if(fuse_opt_parse(&args,&options,option_spec,NULL)=-1)
返回1;
如果(!设备){
用法(argv[0]);
fuse_opt_add_arg(&args,“--help”);
}
主保险丝(args.argc、args.argv和oper、nullptr);
但是,如果用户只指定了一个参数,这是非常糟糕的,而且不太管用,除非该参数恰好也是有效的装入点,因为fuse似乎在打印帮助之前检查装入点的可行性


这肯定是一个常见的问题,所以我想知道这种文件系统的正确用法是什么。

因此,您必须限制用户使用cmd参数的顺序(所有fuse/mount选项都位于devicepath和mountpoint之前)。为简化操作,请确保最后提供设备路径和装入点:

因此,在main函数中,此语句将检查参数的数量是否正确,以及装载点和设备是否与options一样以连字符开头

    if ((argc < 3) || (argv[argc-2][0] == '-') || (argv[argc-1][0] == '-'))
    {
        fprintf(stderr, "usage:  ./myfuse [FUSE and mount options] devicepath mountPoint\n");
        abort();
    }
请注意,在将hem传递给fuse_主功能之前,我从argv中删除了设备路径,并将argc减小1 然后,在调用fuse_main函数时,确保传递my_数据结构:

struct my_state *my_data;
my_data = malloc(sizeof(struct mi_state));
if (mi_data == NULL) {
    perror("main calloc");
    abort();
}

my_data->devicepath = realpath(argv[argc - 2], NULL);
    argv[argc-2] = argv[argc-1];
    argv[argc-1] = NULL;
    argc--;
fuse_main(argc, argv, &my_fuse_operations, mi_data);
以下是my_state结构的定义,您可以将其放入头文件中:

struct my_state{
    char *devicepath;
};
还应在结构定义下方的头文件中添加此定义:

#define BB_DATA ((struct mi_state *) fuse_get_context()->private_data)
在init函数中调用fuse_get_context并返回BB_数据:

void *my_init()
{
    fuse_get_context();
    return BB_DATA;
}
返回值将在fuse_上下文的private_数据字段中传递给所有文件操作,并作为destroy()方法的参数。
fuse\u上下文是在调用此函数之前设置的,fuse\u get\u context()->private\u data返回传递给fuse\u main()的用户\u数据。

@user3188445我也一直在使用fuse,希望我的答案对您有帮助,谢谢您的回答。我也在做类似的事情,只是没有我想象的那么优雅。也许所有的“真实”文件系统都使用较低级别的接口,所以不会出现这种情况?看看这个链接,这里有一个功能齐全的文件系统的源代码