我已经写了一个信号处理程序来处理SIG
,如果我得到太多的话,我想杀死这个过程。那么,以下哪个代码更好,还是我应该同时使用它们?
exit(-1); // or some other exit code
kill(getpid(), SIGKILL);
答案 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,......)并重申,没有理由不优雅地死去您可以。