首页 文章

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

提问于
浏览
3

我读了一些文档,但对我来说还不够清楚 . 我知道两个“结束”进程并且kill()意味着强制它结束,但是终止()应该做什么呢?

1 回答

  • 7

    不知道你写的是什么还不清楚:

    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可以被进程捕获,这允许它执行清理等 . 可以忽略SIGTERM . SIGKILL将字面上杀死进程,进程不能忽略它 .

    在Windows上发布WM_CLOSE消息,当您调用 terminate() 时,应用程序也可以正常处理它 . kill() 调用TerminateProcess(),这或多或少是Windows等价的SIGKILL .

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


    "what causes terminate() to not exit the process."

    这是你,因为你可以 grab terminate() 信号/消息并做你想做的任何事情,或者如果他被提示他是否真的想要退出应用程序,它可以是你的应用程序的用户 . Yet another resource on WM_CLOSE .

相关问题