【问题标题】:Does Qt support forked processesQt 是否支持分叉进程
【发布时间】:2014-03-10 17:05:49
【问题描述】:

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

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

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

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

或者说问题有点不同:我必须在我的应用程序中fork(),并且某些部分可能会在子进程中访问 Qt。尽管有所有 Qt GUI 的东西,我在哪里需要特别注意?

【问题讨论】:

  • 轶事:我使用fork() 然后gdb attach 在 sigsegv 上获取我的 qt 应用程序的回溯 => X 服务器冻结,您必须重新启动计算机。
  • 阅读man fork。顺便说一句,为什么有人会分叉,而不是在孩子身上执行?你想做什么?
  • @BЈовић:通过fork,您可以更轻松地完成某些事情。但这并不是这里问题的真正范围,是否应该使用分叉有很多争论。
  • 你有一个链接到文本解释至少一个?
  • @BЈовић:Hereherehere。基本上,当您必须在不同进程之间共享大量数据时,分叉是有意义的。但它也大大简化了代码。

标签: c++ qt


【解决方案1】:

TL;DR “我可以从 Qt 的 fork 中使用什么?” “任何事情,只要你通过代码审计向自己证明不存在与分叉相关的错误”。

这些都没有经过测试,所以没有人知道与分叉相关的任何东西是否曾经工作过,被破坏了,以及它是否仍然有效。

Qt 有一个持续集成系统,它在多个平台上进行了测试,作为将更改转移到未来版本的先决条件。这包括测试关键领域的性能回归。 IOW,这不是测试套件的玩笑,它是真实的。测试套件中没有解决分叉的事实应该向您发出强烈的信号,表明您在这里是靠自己的。

因此,您需要在任何地方都小心谨慎,并且需要审核您调用的整个 Qt 代码。抱歉,这是唯一合理的答案。

【讨论】:

  • 来自 cmets here :“@Qwertie 分叉并不是那么酷,它以微妙的方式破坏了许多库(如果您在父进程中使用它们)。它会产生意想不到的行为,即使是有经验的人也会感到困惑程序员。- MarkR"...所以,这只是一个明智的答案。
【解决方案2】:

在 MeeGo 上有一个守护进程 applauncherd,它通过在需要时分叉来提高 Qt 应用程序的启动时间。 所以一般来说这是可能的,但是你注意到QCoreApplication::applicationPid() 返回错误的值。据我所知,MeeGo 使用了稍微修改过的 Qt 版本。 它是开源项目,因此您可以检查代码如何解决问题。

另一件事是,当你使用 fork 时,你会失去可移植性,所以一旦你使用了 fork,你就可以使用 fork 相关的 API,不要使用QCoreApplication::applicationPid(),而是直接使用getpid 函数。

【讨论】:

  • 问题更多:我可以从 Qt 的 fork 中使用什么?
  • MeeGo 项目几乎证明了这一点。 applauncherd 非常聪明,它能够使用预初始化窗口(尚不可见)分叉进程。存在与 fork 和 dbus 相关的安全问题。
  • 好吧,但是 GUI 的东西在很大程度上依赖于平台。我很确定在 MacOSX/Cocoa 上是不可能的。另外,问题是,在fork() 之前可以使用多少Qt。因为如果我从不创建任何其他线程,那可能不会成为问题——但如果在 fork() 之前有其他线程,它可能会混淆 Qt。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
  • 2013-09-25
相关资源
最近更新 更多