在我的 Qt C++ 程序中,我创建了如下进程:
myProcess = new QProcess();
myProcess->start(programpath, arguments);
终止进程处理如下:
myProcess->terminate();
QProcess::kill()
用, terminate()
or终止子进程close()
,但我不想使用它,因为它没有给子进程在退出前清理的机会。
有没有其他方法可以退出该过程?谢谢!
terminate
实际上给了这个过程一个清理的机会。被终止的程序必须抓住这个机会,即系统发送一个SIGTERM和应用程序,它可以忽略它并自行干净地退出。如果这仍然不够好,那么您必须实现自己的方式来要求应用程序退出。杰里米·弗里斯纳(Jeremy Friesner)取得了一些不错的继任。如果应用程序代码不是您自己编写的,则您必须仔细阅读该程序的文档,也许它记录了如何做到这一点。
礼貌的方式是让父进程礼貌地要求子进程离开。然后当子进程退出时(根据自己的意愿),QProcess 对象将发出一个finished(int, QProcess::ExitStatus) 信号,并且您可以有一个连接到该信号的插槽以继续您的进程(例如,通过删除当时的 QProcess 对象)。(或者,如果您不介意暂时阻塞 Qt 事件循环,您可以在要求其退出后对 QProcess 对象调用 waitForFinished() ,并且 waitForFinished() 直到进程消失或超时时间已过)
当然,要使上述工作正常,您需要某种方式要求子进程退出。你如何去做这将取决于子进程正在运行什么。如果幸运的话,您可以控制子进程的代码,在这种情况下,您可以修改它以响应父进程的某些操作而退出——例如,您可以将子进程编码为在其 stdin 时退出描述符被关闭,并让父进程在 QProcess 对象上调用 closeWriteChannel() 以导致这种情况发生。或者,如果您在 Linux/Unix 下运行,您可以向子进程发送 SIGINT 信号,子进程可以设置一个处理程序来捕获信号并开始有序关闭。或者如果你想要一些非常愚蠢的东西——又快又脏,让子进程定期检查已知位置是否存在文件(例如“/tmp/hey-child-process-PIDNUMBERHERE-go-away.txt”或其他内容),父进程将创建这样的文件当它想让孩子离开时。并不是说我会推荐最后一种方法,因为我认为它不会非常健壮,除非作为概念证明。