首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >终止QProcess并不会杀伤子进程

终止QProcess并不会杀伤子进程
EN

Stack Overflow用户
提问于 2018-10-22 22:41:40
回答 2查看 1K关注 0票数 1

我有以下问题:我有一个Qt应用程序(c++),它通过bash脚本启动外部java应用程序。当我终止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

文件夹结构:

File

  • *.cpp

  • *.h

  • i2exrep (Folder)
  • myScript.sh

  • .pro (文件夹)

所以我的应用程序启动"myScript.sh“,这将启动"java -jar i2exrep.jar”。

杀死QProcess只会终止"myScript.sh",但"java -jar i2exrep.jar“仍在运行。- i2exrep.jar

编辑:

我用另一个main函数尝试了同样的方法:

#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应用程序也会终止。当我完成第一个程序( GUI应用程序)时,只有脚本被终止,Java应用程序继续运行。我得到以下错误消息:

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

回答 2

Stack Overflow用户

发布于 2018-10-23 16:59:52

我假设您运行一些UNIX系统(因为shell和/路径分隔符)。

你真的需要两个进程( shell和java)吗?也许只留下java就能解决你的问题。将exec添加到脚本中:

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

我的猜测是,当您在终端中运行应用程序然后关闭它时,所有子进程都会收到SIGHUP,因为它们失去了控制终端。当您从GUI应用程序运行脚本时,首先没有控制终端,因此java不会在退出时终止。无论如何,终止子进程的正确方法是向它发送一个信号(SIGTERM,可能在一段时间之后是SIGKILL ),然后等待(2)它的终止。

如果您不想摆脱进程链中的shell进程,请参阅this answer以了解如何将信号转发到shell中的子进程。

票数 1
EN

Stack Overflow用户

发布于 2019-06-05 03:30:35

我通过使用setsid启动这个过程解决了这个问题。

请查看以下示例:

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

有关更多详细信息,请访问this链接。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52931974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档