C ++中exit和kill之间的区别

时间:2017-12-20 02:01:36

标签: c++ exit sigkill

我已经写了一个信号处理程序来处理SIG,如果我得到太多的话,我想杀死这个过程。那么,以下哪个代码更好,还是我应该同时使用它们?

  1. exit(-1); // or some other exit code
  2. kill(getpid(), SIGKILL);

3 个答案:

答案 0 :(得分:4)

你可能不想要任何一个,但你想要的更接近exit而不是kill

kill是来自外部的其他东西,并强行摧毁一个过程。 exit是决定退出执行的进程。后者通常是优选的。

至于为什么exit也不是正确答案:大多数C ++代码依赖于析构函数来在从范围退出时清理对象。如果你调用exit,通常不会发生这种情况 - 你调用exit,它退出到操作系统,并且中间没有调用析构函数(除了用onexit注册的内容之外)。

相反,您通常希望抛出一个通常只在main中捕获的异常,并在捕获时正常退出:

int main() { 
    try {
        do_stuff();
    }
    catch(time_to_die const &) {
    }
}

这种情况的优点是当你执行throw time_to_die;时,它会自动展开堆栈,为所有本地对象执行析构函数。当它回到main时,你得到一个正常退出,所有析构函数都已执行,因此(假设正确使用RAII)所有文件,网络连接,数据库连接等都已按预期关闭,任何缓存都会刷新,等等,这样你就可以获得一个漂亮,优雅的退出。

简短摘要:根据经验,C ++代码永远不应该调用exit。如果您的代码完全陷入破解,并且您想立即退出,则需要致电abort。如果你想要一个半正常的退出,可以通过抛出一个让你回到main的异常来做到这一点,这样你就可以清理东西然后优雅地退出。

答案 1 :(得分:2)

  

C ++中退出和终止之间的区别

一个区别是C ++标准库中未指定kill函数。它仅在POSIX中指定。 exit是标准的C ++。

另一个区别是kill(getpid(), SIGKILL)会导致操作系统强行终止进程。 exit代替执行清理(通过调用atexit回调,刷新流等)并自动终止执行。

  

那么,以下哪个代码更好,还是我应该同时使用它们?

取决于用例,但通常exit更明智,因为通常需要它提供的清理。

答案 2 :(得分:1)

我建议exit(1)

通常情况下,如果可能的话,应用程序会希望优雅地终止。 SIGKILL会立即导致您的流程死亡 - 例如,您的退出处理程序无法被调用。但在您的情况下,您还必须调用getpid以及kill本身。 exit 立即启动优雅的退出流程。它是满足您需求的正确选择。

一般来说,使用SIGKILL很少有很好的架构理由。在POSIX中有这么多信号(http://man7.org/linux/man-pages/man7/signal.7.html,你有SIGINT,SIGTERM,......)并重申,没有理由优雅地死去您可以。