QProcess::kill() 和 QProcess::terminate() 有什么区别?

What's the difference between QProcess::kill() and QProcess::terminate()?

本文关键字:QProcess 区别 什么 kill terminate      更新时间:2023-10-16

我阅读了一些文档,但对我来说还不够清楚。我知道两者都"结束"一个进程,而 kill() 意味着强制它结束,但是 terminate() 应该做什么呢?

Dunno 如果你写过什么还不清楚:

void QProcess::kill()

终止当前进程,使其立即退出。

在 Windows 上,kill() 使用 TerminateProcess,而在 Unix 和 OS X 上,SIGKILL 信号被发送到进程。

http://doc.qt.io/qt-5/qprocess.html#kill

<小时 />

void QProcess::terminate()

尝试终止进程。

由于调用此函数,进程可能不会退出(它有机会提示用户输入任何未保存的文件等)。

在 Windows 上,terminate() 将WM_CLOSE消息发布到进程的所有顶级窗口,然后发布到进程本身的主线程。在Unix和OS X上,SIGTERM信号被发送。

Windows 上不运行事件循环或其事件循环不处理WM_CLOSE消息的控制台应用程序只能通过调用 kill() 来终止。

http://doc.qt.io/qt-5/qprocess.html#terminate

所以,基本上​terminate()不那么残酷,但不能保证这个过程会被终止。

在Unix上,terminate()使用SIGTERM信号,而kill()将SIGKILL发送到进程。它们之间的区别在于SIGTERM可以被一个进程捕获,这允许它执行清理等。SIGKILL会从字面上杀死过程,过程不能忽视它。

在 Windows 上,当您调用 terminate() 时,会发布WM_CLOSE消息,因此应用程序也可以正常处理它。 kill()调用 TerminateProcess(),它或多或少与 SIGKILL 等同于 Windows。

我认为terminate() SIGTERM和WM_CLOSE可以由Qt处理并转换为正常的Qt事件,但你必须自己尝试。当然,您可以通过系统特定的功能来处理它们。

<小时 />

"是什么原因导致终止()不退出进程。"

就是你,因为你可以捕捉terminate()信号/消息,做任何你想做的事情,或者如果他被提示是否真的想退出应用程序,它可以是你的应用程序的用户。另一个关于WM_CLOSE的资源。