我已经编写了一个信号处理程序来处理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 &) {
}
}
在这种情况下的优点是,当您执行throw time_to_die;
,它会自动展开堆栈,同时执行所有本地对象的析构函数。当它回到main
,您会正常退出,所有析构函数都已执行,因此(假设正确使用 RAII)您的所有文件、网络连接、数据库连接等都已按预期关闭,所有缓存都已刷新,等等,因此您获得一个漂亮、优雅的退出。
简短摘要:根据经验,C++ 代码永远不应该调用exit
。如果你的代码完全卡在裂缝中,并且你想立即退出,你想调用abort
。如果您想要半正常退出,请通过抛出异常来实现,该异常将使您返回main
这样你就可以清理东西并优雅地退出。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)