C++中exit和kill的区别

mai*_*mai 2 c++ exit sigkill

我已经编写了一个信号处理程序来处理 a SIG,如果我收到太多信号,我想终止该进程。那么,以下哪个代码更好,或者我应该同时使用它们?

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

Jer*_*fin 5

您可能不想要其中任何一个,但您确实想要的exit比更接近kill

kill是有其他东西从外部进来,并强行破坏进程。exit是进程本身决定退出执行。后者通常是优选的。

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

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

int main() { 
    try {
        do_stuff();
    }
    catch(time_to_die const &) {
    }
}
Run Code Online (Sandbox Code Playgroud)

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

简短摘要:根据经验,C++ 代码永远不应该调用exit. 如果您的代码完全卡在裂缝中,并且您想立即退出,则需要调用abort. 如果您想要半正常退出,请通过抛出异常来完成,该异常会让您返回main,以便您可以清理内容并优雅地退出。