Qt是否支持分叉进程?

6
当我在Qt应用程序中使用fork()时,哪些部分的Qt表现正常?Qt是否支持此操作?
显然,例如在MacOSX上,GUI将无法工作,因为Cocoa本身不支持分叉进程。
但有许多其他部分,例如线程列表等。 QCoreApplication::applicationPid()似乎返回错误的值。(根据here。)
或者换个问题问:我必须在我的应用程序中使用fork(),并且可能有某些部分会在子进程中访问Qt。除了所有Qt GUI内容外,我需要额外注意哪些地方?

趣闻:我使用了 fork()gdb attach 来获取我的 qt 应用程序在 sigsegv 时的回溯 => X 服务器冻结,你必须重新启动计算机。 - BeniBela
阅读 man fork。顺便问一下,有人为什么要 fork 而不是在子进程中执行 execve?你想做什么? - BЈовић
@BЈовић:通过fork,你可以更轻松地完成某些任务。但这并不是问题的重点,因为是否使用fork存在很多争议。 - Albert
你有一个解释至少一个的链接吗? - BЈовић
@BЈовић:这里这里或者这里。基本上,当你需要在不同的进程之间共享大量数据时,fork是有意义的。但它也可以简化代码。 - Albert
2个回答

4
TL;DR:“在分支中我能使用Qt的什么?”“任何东西,只要你通过代码审核证明其中没有与分叉相关的错误。”
以上内容都未被测试过,因此无人知道与分叉有关的任何内容是否可以正常工作。
Qt拥有一个持续集成系统,并在多个平台上进行测试以便将更改推向未来的发布版。这包括在关键领域测试性能回归。换言之,它不是一个玩笑性质的测试套件,而是实实在在的。事实上,测试套件中没有针对分叉进行的测试应该向您发出一个强烈信号,表明您在这里是自己负责。
因此,您需要在每个地方都小心谨慎,并对调用的Qt代码进行全面审核。很抱歉,这是唯一合理的答案。

从这里的评论中可以看出,@Qwertie分叉并不那么酷,它会以微妙的方式破坏许多库(如果您在父进程中使用它们)。它会产生意想不到的行为,甚至会让经验丰富的程序员感到困惑。因此,这是唯一明智的答案。 - BЈовић

1
在MeeGo上有一个守护进程applauncherd,通过在需要时进行分叉来加快Qt应用程序的启动时间。因此,一般来说是可能的,但正如您所注意到的,QCoreApplication::applicationPid()返回错误的值。据我所知,MeeGo使用了稍微修改过的Qt版本。这是一个开源项目,因此您可以检查代码如何解决问题。
另一件事是,当您使用fork时,会失去可移植性,因此一旦使用了fork,就可以使用fork相关的API,而不是使用QCoreApplication::applicationPid(),而是直接使用getpid函数。

1
问题更多的是:我可以在分支中使用Qt的哪些内容? - Albert
MeeGo项目证明了几乎所有事情都是可能的。applauncherd非常智能,它能够使用预初始化窗口(尚未可见)分叉进程。与fork和dbus相关的存在安全问题。 - Marek R
好的,但GUI相关的内容非常依赖于平台。我相当确定在MacOSX/Cocoa上不可能做到同样的事情。此外,问题是,在fork()之前可以使用多少Qt。因为如果我从未创建任何其他线程,那可能不会成为问题——但如果在fork()之前有其他线程,这可能会使Qt混乱。 - Albert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接