C++ C+中退出和终止之间的差异+;
我已经编写了一个信号处理程序来处理一个C++ C+中退出和终止之间的差异+;,c++,exit,sigkill,C++,Exit,Sigkill,我已经编写了一个信号处理程序来处理一个SIG,如果我得到太多的信号,我想终止这个进程。那么,以下哪种代码更好,或者我应该同时使用它们 退出(-1);//或其他一些退出代码 kill(getpid(),SIGKILL) 我建议退出(1) 通常,如果可能的话,应用程序会希望优雅地终止SIGKILL对您的进程来说是一个瞬间死亡——例如,您的退出处理程序将不会被调用。但是在您的情况下,还必须调用getpid以及kill本身退出立即启动优雅的退出过程。这是适合您需求的正确选择 一般来说,使用SIGKILL
SIG
,如果我得到太多的信号,我想终止这个进程。那么,以下哪种代码更好,或者我应该同时使用它们
退出(-1);//或其他一些退出代码
kill(getpid(),SIGKILL)代码>
我建议退出(1) 通常,如果可能的话,应用程序会希望优雅地终止
SIGKILL
对您的进程来说是一个瞬间死亡——例如,您的退出处理程序将不会被调用。但是在您的情况下,还必须调用getpid
以及kill
本身<代码>退出立即启动优雅的退出过程。这是适合您需求的正确选择
一般来说,使用SIGKILL很少有好的架构理由。有很多信号(在POSIX中,有SIGINT,SIGTERM,…),重申一下,如果可以的话,没有理由不优雅地死去
C中退出和终止的区别++
<>一个不同之处是,C++标准库中没有指定<代码>杀灭>代码>函数。它仅在POSIX中指定<代码>退出<代码>是标准C++。
另一个区别是kill(getpid(),SIGKILL)
将导致操作系统强制终止进程<代码>退出而是执行清理(通过调用atexit
回调和刷新流等)并自愿终止执行
那么,以下哪种代码更好,或者我应该同时使用它们
取决于用例,但通常
exit
更合理,因为人们通常希望它提供的清理。您可能不想要任何一个,但您想要的是更接近exit
而不是kill
kill
是从外部传入的另一种东西,它强制破坏一个进程<代码>退出是进程本身决定退出执行的过程。后者通常更可取
<>为什么退出>代码>也不是正确答案:大多数C++代码依赖于析构函数在从范围中退出时清理对象。如果您调用exit
,通常不会发生这种情况——您调用exit,它会退出到操作系统,其间不会调用析构函数(使用onexit
注册的内容除外)
相反,您通常希望抛出一个异常,该异常通常仅在main
中捕获,并在捕获时优雅地退出:
int main() {
try {
do_stuff();
}
catch(time_to_die const &) {
}
}
这种情况下的优点是,当您执行抛出时间时代码>,它会自动展开堆栈,同时对所有本地对象执行析构函数。当它返回到main
时,您会得到一个正常的退出,所有析构函数都已执行,因此(假设正确使用RAII)您的所有文件、网络连接、数据库连接等都已按预期关闭,所有缓存都已刷新,等等,所以您会得到一个漂亮、优雅的退出
简短摘要:作为一个经验法则,C++代码不应该调用<代码>退出>代码>。如果代码完全卡在裂缝中,并且要立即退出,则需要调用
abort
。如果你想要一个半正常的出口,通过抛出一个异常可以让你回到main
,这样你就可以清理东西,然后优雅地退出。man
页面没有足够好地解释这一差异?我个人的偏好是返回
我的退出方式,或者如果退出是因为不好,则抛出一个合适的异常。如果您以后发现您想要捕获过去的退出条件,处理它并继续,那么这两种情况都会更容易处理。代码中忘记的退出
可能会造成麻烦。对于Linux,read和“另一个区别是kill函数将在操作系统强制终止进程之前发送一个可由进程处理的信号”,而不是kill()
。这将在系统关闭时发生,可能是在其他过程监控场景中,但我所知的kill函数不会发生。-kill只发送一个信号(不一定是SIGKILL
)@DanFarrellkill(getpid(),SIGKILL)代码>发送一个SIGKILL
?还是我弄错了?这似乎是特定的信号,在这种情况下,是的,杀死。但是,KILL不能被处理,KILL
不进行任何监视或后续操作killing@DanFarrell我不知道你说的监视是什么意思,但似乎你是对的,它不会调用处理程序。