Завершение QProcess не убивает дочерний процесс - PullRequest
0 голосов
/ 22 октября 2018

У меня следующая проблема: У меня есть Qt GUI-приложение (c ++), которое запускает внешнее Java-приложение через bash-скрипт.Когда я завершаю свой QProcess, сценарий уничтожается, но дочерний процесс (java-приложение) все еще выполняется.

Я не понимаю этого поведения, потому что, если я запускаю сценарий в терминале и уничтожаю его, дочерний процесс также убит.Возможно, это как-то связано с различными циклами событий в Qt, которые я еще не понял.


Вот мой код:

MainWindow.h

#include <QMainWindow>
#include <QProcess>

namespace Ui {
  class MainWindow;
}

class MainWindow : public QMainWindow
{
  Q_OBJECT
public:
  explicit MainWindow(QWidget *parent = nullptr);
  ~MainWindow();

private slots:
  void slot_startQProcess();
  void slot_killQProcess();

private:
  Ui::MainWindow *ui;

  QProcess myProcess;
};

MainWindow.cpp

#include "MainWindow.h"
#include "ui_MainWindow.h"

MainWindow::MainWindow(QWidget *parent) :
  QMainWindow(parent),
  ui(new Ui::MainWindow)
{
  ui->setupUi(this);
  connect(ui->pb_start, &QPushButton::clicked, this, &MainWindow::slot_startQProcess);
  connect(ui->pb_kill, &QPushButton::clicked, this, &MainWindow::slot_killQProcess);
}

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

void MainWindow::slot_startQProcess()
{
  myProcess.setWorkingDirectory("./i2exrep");
  myProcess.start("./myScript.sh");
}

void MainWindow::slot_killQProcess()
{
  myProcess.close();
}

main.cpp

#include "MainWindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
  QApplication a(argc, argv);
  MainWindow w;
  w.show();
  return a.exec();
}

myScript.sh

#!/bin/csh
java -jar i2exrep.jar

Структура папки:

  • .pro файл
  • *. cpp
  • *. h
  • i2exrep (папка)
    • myScript.sh

Таким образом, мое приложение запускает «myScript.sh», который запускает «java -jar i2exrep.jar»

Уничтожение QProcess завершает только «myScript.sh», но «java -jar»i2exrep.jar "все еще работает.- i2exrep.jar


РЕДАКТИРОВАТЬ:

Я пытался сделать то же самое с другой основной функцией:

#include <QCoreApplication>
#include <QProcess>
int main(int argc, char *argv[])
{
  QCoreApplication a(argc, argv);
  QProcess myProcess;
  myProcess.setWorkingDirectory("./i2exrep");
  myProcess.start("./myScript.sh");
  return a.exec();
}

Когда я выйду из этой программы, приложение Java будеттакже прекращено.Когда я заканчиваю первую программу (приложение с графическим интерфейсом), то только сценарий завершается и приложение Java продолжает работать.Я получаю следующее сообщение об ошибке:

QProcess: Destroyed while process ("./myScript.sh") is still running.

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Я решил это с помощью setsid для запуска процесса.

Пожалуйста, проверьте пример ниже:

process->start("setsid ./example.sh");
(...)
QString killingProcess = "kill -TERM -" + QString::number(process->pid());
system(killingProcess.toStdString().c_str());

Для получения более подробной информации, пожалуйста, посетите this ссылка.

0 голосов
/ 23 октября 2018

Я предполагаю, что вы используете некую UNIX-систему (поскольку оболочка и / разделитель пути).

Вам действительно нужны оба процесса (оболочка и java)?Может быть, оставив только Java решит вашу проблему.Добавьте exec к вашему сценарию:

#!/bin/csh
exec java -jar i2exrep.jar

Я предполагаю, что когда вы запускаете свое приложение в терминале, а затем закрываете его, все дочерние процессы получают SIGHUP, поскольку теряют управляющий терминал.Когда вы запускаете скрипт из приложения с графическим интерфейсом, на первом месте нет управляющего терминала, поэтому java не завершится при выходе.В любом случае, правильный способ завершить дочерний процесс - отправить ему сигнал (SIGTERM, может быть, SIGKILL через некоторое время), а затем подождать (2) его завершения.

Если вы не хотите избавляться отпроцесс оболочки в цепочке процессов, см. этот ответ , чтобы узнать, как перенаправить сигналы дочернему процессу в оболочке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...