我已经编写了一个信号处理程序来处理 a SIG
,如果我收到太多信号,我想终止该进程。那么,以下哪个代码更好,或者我应该同时使用它们?
exit(-1); // or some other exit code
kill(getpid(), SIGKILL);
您可能不想要其中任何一个,但您确实想要的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
,以便您可以清理内容并优雅地退出。