我有一个多线程的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中)
答案 0 :(得分:0)
未测试Qt是否与fork()
进行互操作,因此不要期望它得到支持。它是不可移植的,在大多数情况下是不必要的。
你应该使用分离的QProcess
生成自己,然后立即退出。如果您需要在衍生过程中进行任何初始化,则可以将相关数据传递给子项。
My other answer说明了这种技术的基础知识,可以移植到Qt运行的所有平台上。在这种情况下,您将使用QProcess::startDetached
在其自己的会话中启动子进程以充当守护进程。
您可能还想查看QtService解决方案。它可以在Unix和Windows之间移植,前者使用守护进程,后者则使用本机服务API。