如何正确关闭我创建的QProcess?

时间:2012-12-03 03:22:09

标签: c++ qt

在我的Qt C ++程序中,我创建了一个过程如下:

myProcess = new QProcess();
myProcess->start(programpath, arguments);

终止流程的过程如下:

myProcess->terminate();

使用QProcess::kill()terminate()close()终止子流程,但我不想使用它,因为它不会让子流程有机会清理在退出之前。

还有其他方法退出流程吗?谢谢!

2 个答案:

答案 0 :(得分:2)

礼貌的方式是让父进程礼貌地要求子进程消失。然后当子进程退出时(自己的意志),QProcess对象将发出一个完成的(int,QProcess :: ExitStatus)信号,你可以有一个连接到该信号的插槽,它将继续你的进程(例如删除那时的QProcess对象)。 (或者如果你不介意暂时阻止你的Qt事件循环,你可以在要求它退出之后在QProcess对象上调用waitForFinished(),并且waitForFinished()将不会返回,直到进程消失或超时期限已经过去了)

当然,对于上述工作,您需要一些方法来要求子进程退出。你如何做这将取决于子进程运行的内容。如果幸运的话,您可以控制子进程的代码,在这种情况下,您可以修改它以退出以响应父进程的某些操作 - 例如,您可以编写子进程以在其stdin时退出描述符已关闭,并让父进程在QProcess对象上调用closeWriteChannel()以使其发生。或者,如果您在Linux / Unix下运行,您可以向子进程发送SIGINT信号,子进程可以设置一个处理程序来捕获信号并开始有序关闭。或者如果你想要一些非常愚蠢 - 快速和肮脏的东西,让子进程定期检查一个众所周知的位置是否存在文件(例如“/tmp/hey-child-process-PIDNUMBERHERE-go-away.txt”或其他东西)并且父进程会在希望孩子离开时创建这样的文件。不是我建议使用最后一种方法,因为我不认为它会非常强大,除非作为概念证明。

答案 1 :(得分:2)

terminate实际上为该过程提供了清理的机会。被终止的程序只需要抓住这个机会,即系统会找到SIGTERM和应用程序,它可以忽略它并自行退出。如果这仍然不够好,那么你必须实现自己的方式要求应用程序退出。杰里米弗里斯纳取得了一些不错的成就。如果应用程序代码不是由您自己编写的,那么您必须仔细阅读该程序的文档,或许它会记录如何执行此操作。