当我在Qt应用程序中fork()
时,Qt的哪些部分表现得很清醒? Qt是否支持这个?
显然,例如MacOSX上的GUI不起作用,因为Cocoa本身不支持分叉进程。
但还有许多其他部分,例如线程列表等
QCoreApplication::applicationPid()
似乎返回了错误的值。 (根据here。)
或者让问题略有不同:我必须在我的应用中fork()
,并且某些部分可能会在子进程中访问Qt。尽管有Qt GUI的所有内容,我还需要在哪里特别小心?
答案 0 :(得分:3)
TL; DR “我可以在分叉中使用Qt中的哪些内容?” “任何事情,只要你通过代码审计向自己证明,那里没有与分叉有关的错误”。
这些都没有经过测试,所以没有人知道是否有任何与分叉相关的东西曾经起作用,并且被打破了,以及它是否仍然有效。
Qt有一个持续集成系统,它在多个平台上进行测试,作为将更改升级到未来版本的先决条件。这包括测试关键领域的性能回归。 IOW,它不是测试套件的笑话,它是真实的。在测试套件中没有解决分叉的事实应该是一个强烈的信号,告诉你,你在这里独自一人。
因此,您需要在任何地方都要小心,并且需要审核您调用的整个Qt代码。对不起,这是唯一合理的答案。
答案 1 :(得分:1)
在MeeGo上有一个守护进程applauncherd
,它通过在需要时分叉来提高Qt应用程序的启动时间。
所以一般情况下这是可能的,但正如您所注意到QCoreApplication::applicationPid()
返回错误的值。据我所知,MeeGo使用了稍微修改过的Qt版本。
它是开源项目,因此您可以检查代码如何解决问题。
当你使用fork时,你会失去可移植性,所以一旦你使用了fork你可以使用fork相关的API而不使用QCoreApplication::applicationPid()
但是直接使用getpid
函数。