在Qt中获取fork之后的进程的PID

时间:2014-02-02 18:26:38

标签: qt fork pid

我正在创建一个成功分叉的Qt / C ++控制台应用程序。当我在fork之前调用QCoreApplication :: applicationPid(),然后在fork之后(在子节点中),我得到相同的pid。

我意识到我可以使用fork()的返回值,但我正在尝试用Qt方式做事。在Qt中是否有更好/正确的方法来获得孩子的PID(来自孩子内部)?

出于好奇,QCoreApplication :: applicationPid()为什么不提供新的PID?我假设它现在提供ppid ....

1 个答案:

答案 0 :(得分:1)

fork()的返回值取决于您是在fork还是在父级中。见here

  

成功时,子进程的PID在父进程中返回,并在子进程中返回0。失败时,在父项中返回-1,不创建子进程,并正确设置errno。

因此,你只能在fork()的父母中得到孩子的pid(而不是你似乎暗示的孩子)。这实际上就是你如何检查你是否在孩子身边 - 即返回值是否为0。

反正:

无法fork Qt方式,因为在所有平台(尤其是Windows)上都无法进行分叉,因此Qt无法进行分配。

另请注意,Qt的某些部分可能在子级中处于无效状态(例如,在MacOSX上,Cocoa GUI无法在分叉进程中使用)。所以要小心。

我还没有真正发现Qt是否支持forks的细节(我的意思是它表现得很健全:例如,fork中的线程列表会有所不同,因此必须注意这一点)。我问过here

QCoreApplication::applicationPid()可能会缓存该值,从而在子级中返回错误的值。但不关心这一点,只需使用getpid() - 您已经在使用非跨平台fork()