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

问题描述 投票:0回答:3

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

  1. exit(-1); // or some other exit code
  2. kill(getpid(), SIGKILL);
c++ exit sigkill
3个回答
2
投票

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

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

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

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

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


4
投票

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

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

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

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

main

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

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


1
投票

我会推荐main

通常情况下,应用程序可能希望尽可能优雅地终止。 exit(1)是你的过程的即时死亡 - 例如,你的退出处理程序不会被调用。但在你的情况下,你还必须调用SIGKILL以及getpid本身。 kill立即启动优雅的退出流程。这是满足您需求的正确选择。

一般来说,使用SIGKILL很少有很好的架构理由。有这么多的信号(POSIX中的exit,你有SIGINT,SIGTERM,......)并重申,如果可以的话,没有理由不优雅地死去。

© www.soinside.com 2019 - 2024. All rights reserved.