分叉(背景)Qt应用程序将无法正常退出

时间:2014-02-25 20:09:11

标签: qt process fork wait qthread

我有一个多线程的Qt / C ++应用程序,它在前台工作得很好,但是当它被dameonizes时它不会正常关闭。这个过程仍然活跃,但仍在等待观看 - 请参阅等待计划的回溯:

(gdb) bt
#0  0x000000372460b575 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1  0x00007f8990fb454b in QWaitCondition::wait(QMutex*, unsigned long) ()
   from /opt/Qt/5.1.1/gcc_64/lib/libQt5Core.so.5
#2  0x00007f8990fb3b3e in QThread::wait(unsigned long) () from /opt/Qt/5.1.1/gcc_64/lib/libQt5Core.so.5
#3  0x00007f8990fb0402 in QThreadPoolPrivate::reset() () from /opt/Qt/5.1.1/gcc_64/lib/libQt5Core.so.5
#4  0x00007f8990fb0561 in QThreadPool::waitForDone(int) () from /opt/Qt/5.1.1/gcc_64/lib/libQt5Core.so.5
#5  0x00007f89911a4261 in QMetaObject::activate(QObject*, int, int, void**) ()
   from /opt/Qt/5.1.1/gcc_64/lib/libQt5Core.so.5
#6  0x00007f89911a4d5f in QObject::destroyed(QObject*) () from /opt/Qt/5.1.1/gcc_64/lib/libQt5Core.so.5
#7  0x00007f89911aa3ee in QObject::~QObject() () from /opt/Qt/5.1.1/gcc_64/lib/libQt5Core.so.5
#8  0x0000000000409d8b in main (argc=1, argv=0x7fffba44c8f8) at ../../src/main.cpp:27
(gdb) 

我现在意识到我的代码首先创建了一个线程,然后分叉,以防万一。前台进程正常退出(确认PID已消失),但后台pid永远不会结束。这可能与我在父母中创建QThread的事实有关吗?如果是这样,我如何使这个等待线程死?

如果没有,是否有一种特殊方法可以退出已被守护的控制台应用程序? (在Qt中)

1 个答案:

答案 0 :(得分:0)

未测试Qt是否与fork()进行互操作,因此不要期望它得到支持。它是不可移植的,在大多数情况下是不必要的。

你应该使用分离的QProcess生成自己,然后立即退出。如果您需要在衍生过程中进行任何初始化,则可以将相关数据传递给子项。

My other answer说明了这种技术的基础知识,可以移植到Qt运行的所有平台上。在这种情况下,您将使用QProcess::startDetached在其自己的会话中启动子进程以充当守护进程。

您可能还想查看QtService解决方案。它可以在Unix和Windows之间移植,前者使用守护进程,后者则使用本机服务API。