Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中退出和终止之间的差异+;_C++_Exit_Sigkill - Fatal编程技术网

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
    )@DanFarrell
    kill(getpid(),SIGKILL)发送一个
    SIGKILL
    ?还是我弄错了?这似乎是特定的信号,在这种情况下,是的,杀死。但是,KILL不能被处理,
    KILL
    不进行任何监视或后续操作killing@DanFarrell我不知道你说的监视是什么意思,但似乎你是对的,它不会调用处理程序。