启动 QtAssistant 时项目挂起 QProcess::start

Project hangs on QProcess::start when starting QtAssistant

我正在使用 QProcess::start 启动 Qt Assistant 我的自定义帮助项目文件。在我将项目(不是帮助项目文件)加载到我的程序之前,它工作正常。 Programm 使用自定义库从特定数据生成图像。即使当所有进程结束并且我看到生成的图像并且没有其他任何事情发生时,当我尝试启动 Qt Assistant 时,我的程序在尝试启动进程时挂在 QProcess:start 函数。代码是:

show() 函数(public):

if (!run())
    return false;
QByteArray ba("setSource ");
ba.append("qthelp://insyn_help/doc/");

proc->write(ba + page.toLocal8Bit() + '\n');
return true;

run() 函数(私有):

if (!proc)
    proc = new QProcess();
if (proc->state() == QProcess::Running)
    return true;
QString app = QString(QT_BIN_DIR) + QDir::separator() + QString("assistant");
QString path = QString(PREFIX) + QString(HELP_INSTALL_PATH) + QString("/help_project.qhc");
QStringList args;
args << QLatin1String("-collectionFile")
     << QLatin1String(path.toLatin1())
     << QLatin1String("-enableRemoteControl");

QFileInfo help_project(path);
if (help_project.exists()) {
    proc->start(app,args);
    if (!proc->waitForStarted()) {
        m_exitCode = 1;
        emit closed();
        return false;
    }
}

此代码是 AssistantLauncher class 的一部分,它是使用 qmlRegisterType 注册并作为应用程序 window 的成员添加到 main.qml 的。我的程序不会在任何地方触及它(调用方法 show() 除外)。它是单独的对象(除了它是 appWindow 的一部分)。问题是为什么只有在我的程序做了一些工作之后这个过程才能启动?以及为什么 QProcess::start 甚至没有超时。

UPD:我将 proc->start(app,args); 移动到子进程,这是我通过使用 fork() 获得的,现在我的程序挂在 pid_t child = fork(). 所以问题是无法创建新进程。

答案是不要使用fork(),因为在大项目中很危险。更多信息见 http://www.evanjones.ca/fork-is-dangerous.htmlposix_spawn 也挂了我的项目。现在我决定 fork() 新进程开始并通过管道向它发送命令。