C++ Qt支持分叉进程吗

C++ Qt支持分叉进程吗,c++,qt,C++,Qt,当我在Qt应用程序中使用fork()时,Qt的哪些部分表现正常?Qt支持这个吗 显然,例如MacOSX上的GUI将无法工作,因为Cocoa本身不支持分叉进程 但是还有许多其他部分,例如线程列表等 QCoreApplication::applicationPid()似乎返回了错误的值。(根据) 或者让问题稍微不同一点:我必须在我的应用程序中fork(),并且在子进程中有某些部分可能访问Qt。在MeeGo上,有一个守护进程applauncherd,它通过在需要时分叉来延长Qt应用程序的启动时间,我需

当我在Qt应用程序中使用fork()时,Qt的哪些部分表现正常?Qt支持这个吗

显然,例如MacOSX上的GUI将无法工作,因为Cocoa本身不支持分叉进程

但是还有许多其他部分,例如线程列表等

QCoreApplication::applicationPid()
似乎返回了错误的值。(根据)


或者让问题稍微不同一点:我必须在我的应用程序中
fork()
,并且在子进程中有某些部分可能访问Qt。在MeeGo上,有一个守护进程
applauncherd
,它通过在需要时分叉来延长Qt应用程序的启动时间,我需要在哪里特别小心呢。 所以一般来说这是可能的,但正如您所注意到的,
QCoreApplication::applicationPid()
返回了错误的值。据我所知,MeeGo使用了一个稍微修改过的Qt版本。 这是一个开源项目,因此您可以检查代码,了解他们是如何解决问题的

另一件事是,当你使用fork时,你就失去了可移植性,所以一旦你使用了fork,你就可以使用fork相关的API,而不是使用
QCoreApplication::applicationPid()
,而是直接使用
getpid
函数;DR“我可以在fork中使用Qt的什么?”“任何东西,只要您通过代码审计向自己证明,那里没有与fork相关的bug”

所有这些都没有经过测试,因此没有人知道与分叉相关的任何东西是否曾经起作用,是否已经损坏,以及它是否仍然有效

Qt有一个持续集成系统,它在多个平台上进行测试,作为将更改转移到未来版本的先决条件。这包括测试关键领域的性能回归。瞧,这不是开玩笑的测试套件,这是真的。事实上,在测试套件中没有解决分叉问题,这应该是一个强烈的信号,告诉您您在这里是独立的


因此,您需要处处小心,并且需要审计您调用的整个Qt代码。抱歉,这是唯一合理的答案。

轶事:我使用
fork()
然后
gdb attach
在sigsegv=>X服务器冻结,您必须重新启动计算机。请阅读。顺便说一句,为什么有人会用叉子叉,而不是在孩子身上叉?你想做什么?@Bццћ:通过
叉子
,你可以更轻松地完成某些事情。但这并不是问题的真正范围,是否应该使用叉子有很多火焰战。你有至少一个解释的文本链接吗?@Bццћ:,或。基本上,当您必须在不同进程之间共享大量数据时,fork是有意义的。但它也大大简化了代码。问题更多:我可以在fork中使用Qt做什么?MeeGo项目几乎证明了这一点
applauncherd
非常智能,它能够用预初始化的窗口(还不可见)派生进程。有一个与fork和dbus相关的安全问题,但是GUI的东西严重依赖于平台。我很确定在MacOSX/Cocoa上不可能实现同样的功能。此外,问题是,在
fork()
之前可以使用多少Qt。因为如果我从不创建任何其他线程,这可能不会是一个问题——但是如果在
fork()
之前有其他线程,这可能会混淆Qt。从评论中可以看出:“@Qwertie forking没有那么酷,它以微妙的方式破坏了许多库(如果在父进程中使用它们的话)。它会产生意想不到的行为,甚至会让有经验的程序员感到困惑。-MarkR“。。。因此,这是唯一明智的答案。