使用Qt编程的FUSE(用户空间中的文件系统)

时间:2010-09-05 03:59:14

标签: qt fuse

我正在尝试将FUSE与Qt一起使用,但fuse_main()和app.exec()有自己的事件循环。这意味着如果我开始一个,另一个将无法启动,因为第一个启动会阻止另一个启动,如下所示。怎么处理这个?

有关保险丝的更多信息,请转到http://fuse.sourceforge.net/

如果可能,请提供示例。

谢谢你, Leandro的。

示例:

这个会阻止保险丝启动:

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv); // qt event loop
    a.exec();
    fuse_main(argc, argv, &hello_oper); // fuse event loop, it will not start
    return 0;
}

这个会阻止qt开始:

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv); // it will not start due to fuse_main invocation
    fuse_main(argc, argv, &hello_oper);
    return a.exec();
}

3 个答案:

答案 0 :(得分:1)

您应该在单独的线程上运行文件系统。

答案 1 :(得分:0)

您还可以在单​​独的进程上运行FUSE,并通过套接字/管道/ RPC / ...进行通信。在FUSE崩溃或忙于执行某些操作的情况下,首选您的GUI仍在工作。

答案 2 :(得分:0)

我创建了一个如何一起使用FUSE和Qt的简单示例,请参阅:   https://github.com/qknight/qt-fuse-example

不能使用fuse_main(..)便利功能,因为那时你没有任何办法: - 重新路由posix信号 - 您无法轻松关闭保险丝过程,例如使用QFuse.cpp:     fuse_unmount(TUP_MNT,fs.ch);     pthread_join(fs.pid,NULL);

正如fuse-devel邮件列表中所讨论的,将FUSE集成到Qt有两种很好的方法:

  1. 实现它(正如我在 qt-fuse 中所做的那样):

    Qt mainloop 正在运行, FUSE mainloop 也在运行,在不同的线程。我解决了POSIX :: signal to Qt :: signal转换的一些问题,因此可以明确关闭。

  2. 修改FUSE库以直接从Qt事件循环访问

    Qt mainloop 正在运行,不需要FUSE主循环,因为它将集成到Qt主循环中。没有考虑到这一点,但它可能有不同的优势。

  3. 希望这会有所帮助