在QProcess中调用execv仅在Windows下触发finished()信号

时间:2015-03-11 16:23:51

标签: c++ qt

我写了这个例子来说明linux和windows之间在进程处理方面的区别。

我的主应用程序通过调用QProcess :: start()启动一个子应用程序。如果此子进程通过调用execv(Windows下的_execv)重新启动自身,则仅在Windows下的顶级应用程序上触发finished()信号。就我而言,这是出乎意料的。

有没有办法避免这个信号,或者这是一个QProcess错误?

马修

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);

   connect( ui->pushButtonStart, SIGNAL( clicked() ), this, SLOT( start() ) ) ;
   connect( ui->pushButtonRestart, SIGNAL( clicked() ), this, SLOT( restart() ) ) ;
   connect( &m_process, SIGNAL( finished(int, QProcess::ExitStatus) ),
            this, SLOT( finished(int, QProcess::ExitStatus) ) ) ;

   m_process.setProcessChannelMode( QProcess::MergedChannels );
}

MainWindow::~MainWindow()
{
   delete ui;
}

void
MainWindow::start()
{
   m_process.start( qPrintable( QApplication::applicationFilePath() ) ) ;
}

void
MainWindow::restart()
{
   char *argv[2] ;
   argv[0] = strdup( QApplication::applicationFilePath().toStdString().c_str() ) ;
   argv[1] = NULL ;
   execv( qPrintable( QApplication::applicationFilePath() ), argv ) ;
}

void
MainWindow::finished
(
   int                  exitCode,
   QProcess::ExitStatus exitStatus
)
{
   qDebug() << "Finished!" ;
}

0 个答案:

没有答案