精华内容
下载资源
问答
  • 多时候我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,比如main()函数运行结束、在程序的某个地方用exit() 结束程序、用户通过Ctrl+C或Ctrl+break操作来终止程序等等,因此需要有一...
  • 结束程序函数exit、 _exit、 atexit区别

    千次阅读 2013-05-17 11:24:20
    多时候我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,比如main()函数运行结束、在程序的某个地方用exit() 结束程序、用户通过Ctrl+C或Ctrl+break操作来终止程序等等,因此需要有一...
    多时候我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,比如main()函数运行结束、在程序的某个地方用exit() 结束程序、用户通过Ctrl+C或Ctrl+break操作来终止程序等等,因此需要有一种与程序退出方式无关的方法来进行程序退出时的必要处理。方法就 是用atexit()函数来注册程序正常终止时要被调用的函数。 
    

        atexit()函数的参数是一个函数指针,函数指针指向一个没有参数也没有返回值的函数。atexit()的函数原型是:int atexit (void (*)(void));

        在一个程序中最多可以用atexit()注册32个处理函数,这些处理函数的调用顺序与其注册的顺序相反,也即最先注册的最后调用,最后注册的最先调用。

    #include <stdlib.h>
    #include <stdio.h>

    void fun()
    {
        printf("fun/n");
    }

    int main()
    {
        atexit(fun);
        printf("hello/n");
        return 0;
    }

    // int atexit(void (*func)()) //  <stdlib.h> 中定义
    // {
    //     func();
    //     return 0;
    // }

    上面的代码将输出

    hello

    fun

    而把红色的注释代码去掉之后,由于Interpositioning行为,重定义了库函数,使atexit仅仅表现为一个普通的函数

    因此输出

    fun 

    hello

     

     

    #include <stdlib.h>

    #define EXIT_FAILURE ...
    #define EXIT_SUCCESS ...

    void exit (int status);

    void _Exit(int status);          //C99

    void abort(void);

    int atexit(void (*func)(void)));

    exit、_Exit与abort函数使程序终止,控制并不返回到这些函数的调用者。

    函数exit正常终止程序,并进行下列清理操作:

    1.(进对标准C语言)所有想atexit函数注册的函数按与注册时相反的顺序调用,注册几次就调用几次。

    2. 刷新打开的是输出流,关闭所有打开的数据流。

    3. 删除tepfile函数生成的文件。

    4. 控制返回宿主环境,提供状态值。

    按照许多系统中的习惯,status值为0表示终止程序成功,用非0值表示异常终止。标准C语言中数值0和宏 EXIT_SCCESS的值表示终止成功,宏EXIT_FAILURE的值表示终止不成功,其他值的含义由实现定义。从函数main返回一个整数值相当于用这个值调用exit函数。

    函数_Exit与exit函数不同之处在于既不调用atexit注册的退出处理器,也不调用singal注册的信号处理器。是否进行其他清理操作由实现定义,如关闭所有打开的数据流。_Exit是C99增加的,传统上有些实现用名为_exit的函数提供类似功能。

    abort函数使程序异常终止,不调用向atexit注册的函数。abort是否引起清理操作由实现定义,向宿主系统返回的状态值也由实现定义,但应表示为“不成功”。在标准C语言和许多传统实现中,调用abort转换成可以捕获的特殊信号(标准C语言中为 SIGABRT)。如果信号被忽略或处理器返回,则标准C语言实现仍然终止程序,而其他实现可能使abort函数返回调用者。断言失败也会调用 abort。

    atexit函数是标准C语言中增加的,它注册一个函数,使得调用exit时或函数main返回时会调用这个函数。程序异常终止时(如用abort或raise终止),不调用注册的函数。实现应允许至少注册32个函数。如果注册成功,则atexit函数返回0,否则返回非0值,函数无法注销。所有向atexit函数注册的函数按与注册相反的顺序调用,然后再由atexit函数完成所有标准清理操作。每个函数不代参数调用,应具有返回类型void。注册函数不能引用任何不是自己定义的存储类为auto或 register的对象(例如通过指针引用)。函数注册几次就会在此时调用几次。



    指针函数使用示例: 
    #include<stdlib.h>
    #include<stdio.h>

    typedef void (*pFunc)(float a);

    // int atexit(void (*func)())
    // {
    //     func();
    //     return 0;
    // }

    int atexitf( void (*func)(float),float a)
    {
        func(a);
        return 0;
    }

    void test(float a)
    {
         printf("test %f/n",a);
    }

    // void fun()
    // {
    //     printf("fun/n");
    // }

    int main()
    {
        pFunc pFunc1 = (pFunc)test;  // 函数指针赋值
        pFunc1(4.5);
    /*    atexit(fun);*/
        atexitf(pFunc1,3.66);
        atexitf(test,3.66);
        //atexitf(test(4.3));
        printf("hello/n");
        getchar();
        return 0;
    }

    展开全文
  • exit()函数用于在程序运行的过程中随时结束程序,exit的参数state是返回给操作系统,返回0表示程序正常结束,非0表示程序非正常结束。main函数结束时也会隐式地调用exit函数。****exit函数运行时首先会执行由atexit()...

    一、exit()函数
    函数声明:void exit(int state);
    exit()函数用于在程序运行的过程中随时结束程序,exit的参数state是返回给操作系统,返回0表示程序正常结束,非0表示程序非正常结束。main函数结束时也会隐式地调用exit函数。****exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流、关闭所有打开的流并且关闭通过标准I/O函数tmpfile()创建的临时文件。

    二、atexit()函数
    函数声明:int atexit(void (*func)(void));
    很多时候我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,比如main()函数运行结束、在程序的某个地方用exit()结束程序、用户通过Ctrl+C或Ctrl+break操作来终止程序等等,因此需要有一种与程序退出方式无关的方法来进行程序退出时的必要处理。方法就是用atexit()函数来注册程序正常终止时要被调用的函数*atexit()函数的参数是一个函数指针,函数指针指向一个没有参数也没有返回值的函数。**atexit()的函数原型是:int atexit (void ()(void));在一个程序中最多可以用atexit()注册32个处理函数,这些处理函数的调用顺序与其注册的顺序相反,也即最先注册的最后调用,最后注册的最先调用。

    三,
    在程序中,需要执行的函数由atexit()函数来注册。使这些函数在main执行后调用。

    atexit这个玩意超有用,可以按照你予设的顺序摧毁全局变量(类),例如有个log类,你在其它的全局类里也有可能调用到Log类写日志。所以log类必须最后被析构。假如没有规定析构顺序,那么程序在退出时将有可能首先析构log类,那么其它的全局类在此时将无法正确写日志。

    把数据写回文件, 删除临时文件, 这才是真正有用的.

    展开全文
  • exit与_exit函数都是进程正常退出的函数 exit函数格式: #include void exit(int status); _exit函数格式: #include void _exit(int status); 相同点: 1 这两个函数都是正常退出进程 2 ...

    exit与_exit函数都是进程正常退出的函数


    exit函数格式:

    #include <stdlib.h>

    void exit(int status);


    _exit函数格式:

    #include <unistd.h>

    void _exit(int status);


    相同点:

    1 这两个函数都是正常退出进程

    2 不论调用是否成功,都没有返回信息


    不同点:

    1 exit函数会对输入输出流进行判断,释放所占用的资源以及清空缓冲区,在终止进程时会关闭所有文件,清空缓冲区

    2 _exit函数则不具备刷新缓冲区等操作的功能


    总结:所有fork与vfork创建进程的函数,尽量不要使用exit函数终止子进程


    展开全文
  • iOS终止函数exit

    千次阅读 2015-08-14 16:44:20
    C,C++函数exit用来终止当前程序, 函数定义如下: void exit (int status);  官方说明如下: Terminates the process normally, performing the regular cleanup for terminating programs...

    1.   exit函数

    C,C++函数exit用来终止当前程序, 函数定义如下:


    1. void exit (int status);  


    官方说明如下:

    Terminates the process normally, performing the regular cleanup for terminating programs.
    Normal program termination performs the following (in the same order):

    • Objects associated with the current thread with thread storage duration are destroyed (C++11 only).
    • Objects with static storage duration are destroyed (C++) and functions registered withatexit are called.
    • All C streams (open with functions in <cstudio>) are closed (and flushed, if buffered), and all files created with tmpfile are removed.
    • Control is returned to the host environment.
    第三第四点比较容易理解就不展开讨论


    第一点:

    这里的thread storage指的是线程局部存储, 在线程作用域有效, c++11定义thread storage如下:

    1. thread_local Object obj;  //Object为C++类  
    2. thread_local int value = 1;  


    第二点:
    static storage指的是全局或者函数中static方式定义的变量, 该部分变量会存储到静态存储区(区别于heap和stack), 比如:
    1. Object gObj;  
    2.   
    3. void fun(){  
    4.   
    5.   static Object sObj;  
    6.   
    7. }  
    atexit设置的函数在exit过程中会被调用, atexit函数定义如下:
    1. int atexit (void (*func)(void));  

    atexit例子如下:
    1. /* atexit example */  
    2. #include <stdio.h>      /* puts */  
    3. #include <stdlib.h>     /* atexit */  
    4.   
    5. void fnExit1 (void)  
    6. {  
    7.   puts ("Exit function 1.");  
    8. }  
    9.   
    10. void fnExit2 (void)  
    11. {  
    12.   puts ("Exit function 2.");  
    13. }  
    14.   
    15. int main ()  
    16. {  
    17.   atexit (fnExit1);  
    18.   atexit (fnExit2);  
    19.   puts ("Main function.");  
    20.   exit(0);  
    21. }  

    输出为:
    1. Main function.  
    2. Exit function 2.  
    3. Exit function 1.  


    对C++ object销毁顺序, 可以看以下例子:
    1. #include <stdio.h>  
    2. #include <stdlib.h>  
    3. #include <unistd.h>  
    4. #include <thread>  
    5. #include <string>  
    6. #include <iostream>  
    7.   
    8. class MyObject  
    9. {  
    10. public:  
    11.     std::string str;  
    12. public:  
    13.     MyObject(std::string str){  
    14.         this->str = str;  
    15.     }  
    16.       
    17.     ~MyObject(){  
    18.         printf("%s -- %s\n", __FUNCTION__, str.c_str());  
    19.     }  
    20. };  
    21.   
    22.   
    23. void thread_fun(int n)  
    24. {  
    25.     thread_local MyObject threadObj("thread_local subthread  obj");  
    26.     //do something  
    27.     sleep(2);  
    28. }  
    29.   
    30. void exit_fun(){  
    31.     MyObject threadObj("atexit obj");  
    32.     //do something  
    33.     sleep(1);  
    34. }  
    35.   
    36. MyObject obj("global obj");  
    37. int main(int argc, const char * argv[])  
    38. {  
    39.     thread_local MyObject threadObj("thread_local mainthread  obj");  
    40.     static MyObject staticObj("fun static obj");  
    41.     std::thread t(thread_fun, 1);  
    42.     atexit(exit_fun);  
    43.       
    44.     sleep(2);  
    45.     exit(0);  
    46. }  

    输出:
    1. ~MyObject -- thread_local subthread  obj   
    2. ~MyObject -- thread_local mainthread  obj  
    3. ~MyObject -- atexit obj  
    4. ~MyObject -- fun static obj  
    5. ~MyObject -- global obj  
    6. Program ended with exit code: 0  

    从上面可以看出, 对于第二点是先调用atexit, 再清理static storage


    2. exit vs abort

    void abort (void);

    abort函数实际上是发送SIGABRT signal, 如果不处理则直接终止程序,此时并不会做cleanup操作,相当于直接终止程序。


    3. IOS exit函数


    双击Home 手动kill掉程序, 会调用exit函数关闭程序, __cxa_finalize函数会执行上面讲到清理工作。


    如果重载了AppDelegate applicationWillTerminate函数,则在执行exit之前会调用该函数,终止前提供开发者程序处理机会。



    如果程序已经退到后台并处于suspend状态, 这时手动kill并不会按照上面方式调用exit, 而是发送SIGKILL signal, 直接终止程序。


    4. exit和多线程

    当exit被调用时, 如果其它线程正在执行并且访问了 global或者staic c++ object对象时, 则可能由于这些对象已被销毁而出现无法预期的内存错误,比如:SIGBUS,SIGSEGV。 如需避免该问题可以有以下一些处理方案:

    1). 把对象从static storage移动heap上, 避免exit过程销毁对象而出现非预期结果
    比如:
    1. MyObject gObj("global obj");  
    2. // ------>  
    3. MyObject* pObj = new MyObject("global obj ptr");  

    2). 通过atexit注册回调, 或者applicationWillTerminate(iOS) 中结束子线程避免引用可能销毁的对象。


    5. iOS上终止程序

    1).  主动调用exit或用户终止(程序未进入suspend状态, applicationDidEnterBackground 未回调

    在iOS上可以直接调用exit(0)终止程序,也会按照上面说到的cleanup清理c++ object. (注:iOS 7.0模拟器未做清理,iPhone和7.1模拟器都ok, 估计是模拟器bug)

    2). 如果程序已经进入suspend状态 applicationDidEnterBackground已经回调,则系统会直接发送SIGKILL强制程序直接结束


    展开全文
  • C++退出函数exit

    万次阅读 2017-08-14 12:18:27
    exit为C++的退出函数,声明于stdlib.h中,对于C++其标准的头文件为cstdlib,声明为 void exit(int value); exit的功能为,退出当前运行的程序,并将参数value返回给主调进程。 在main中return v;的效果 与exit(v);...
  • linux的退出函数exit( )、_exit( )

    千次阅读 2018-07-05 15:16:26
    1、void exit(int status);...所有通过atexit( )和 on_exit( ) 注册的函数,会被挂在一个链表上,后注册的函数被挂在链表的最前面,当执行本函数exit()时,该链表上的函数会从头一个个的执行一遍(...
  • exit 函数

    千次阅读 2017-12-20 13:17:25
    exit 函数 头文件 使用 用在子程序中用来终结程序用的,使用后程序自动结束,跳回操作系统。 exit(0) 表示程序正常退出。 exit(1) / exit(-1) 表示程序异常退出。 exit() 结束当前...
  • 万能的退出函数exit VS ExitProcess

    千次阅读 2017-08-08 09:53:59
    exit和ExitProcess有共同的特点...exit是c函数,调用方式如下:  exit(1);  ExitProcess是api函数,调用方式如下:  ExitProcess(0);  作为使用者 我们基本可以认为exit是完美的,在我自己的使用中还没发现ex
  • exit函数

    2016-03-03 16:55:13
    exit()函数用于在程序运行的过程中随时结束程序,exit的参数state是返回给操作系统,返回0表示程序正常结束,非0表示程序非正常结束。main函数结束时也会隐式地调用exit函数exit函数运行时首先会
  • 在谈论exit函数与_exit函数之前,我们先了解一下他们的使用场景,他们是在进程终止中使用的,那什么是进程终止呢? 进程终止 进程终止的场景: (1)代码运行完毕,结果正确; 即就是进程中的所有代码都已...
  • (1)exit() _exit() _Exit()  #include : void exit( int status ); void _Exit( int status );...在图1中可以看出:这三个函数⽤用于正常终⽌止⼀一个程序,_exit和_Exit⽴立即进⼊入内核,而exit
  • exit()和_exit()函数都是用来终止进程的。当程序执行到exit()或_exit()时,进程会无条件地停止剩下的所有操作,清除包括PCB在内的各种数据结构,并终止本进程的运行。 exit()和_exit()函数的区别:这两个函数的调用...
  • 摘要:本文主要讲述进程的终止方式,以及如何使用exit()函数来终止进程,回收进程用户空间资源;分析了exit()函数与_exit()函数,return关键字的差异.同时详细解读了如何使用atexit()和on_exit()函数来注册终止处理...
  • Python exit函数

    万次阅读 2018-08-26 13:56:11
    Python exit()函数介绍、使用和注意事项。
  • exit()函数用于在程序运行的过程中随时结束程序,exit的参数state是返回给操作系统,返回0表示程序正常结束,非0表示程序非正常结束。main函数结束时也会隐式地调用exit函数exit函数运行时首先会执行由atexit()函数...
  • absort函数exit函数

    千次阅读 2016-06-14 06:19:00
    1. exit()函数结束并退出程序。 1. abosrt()函数会触发程序的异常,然后程序后面的语句就不会执行了。用来提示错误。会出现: 转载于:https://www.cnblogs.com/sjxbg/p/5582639.html...
  • 功 能: 注册终止函数(即main执行结束后调用的函数) 用 法: int atexit(void (*func)(void)); 注意:按照ISO C的规定,一个进程可以登记多达32个函数,这些函数将由exit自动调用。atexit()注册的函数类型应为不...
  • EXIT_FAILURE和EXIT_SUCCESS是C语言头文件库中定义的一个符号常量,在vc++6.0下头文件stdlib.h中定义如: #define EXIT_FAILURE 1 #define EXIT_SUCCESS 0 EXIT_FAILURE 可以作为exit()的参数来使用,表示没有成功的...
  • atexit函数和on_exit函数

    千次阅读 2018-05-22 16:51:52
    相关函数 _exit,exit,on_exit 函数原型 #include&lt;stdlib.h&gt; int atexit (void(*function)(void)); 返回值 如果执行成功则返回0,否则返回-1,失败原因存于errno中。 函数说明 atexit()用来设置...
  • 一、简介一般情况下进程正常退出返回0,异常退出则返回相应的退出码。...1、main函数中执行return退出 2、exit 3、_exit 异常结束: 1、ctrl + c,信号终止 2、kill信号终止—— 3、abort() 不管进程是上述什么方法退
  • 在C语言中,我们用continue,break,return结束循环或退出函数 continue:结束本次循环 break:跳出整个循环,或跳出switch()语句 return:结束当前函数 在Linux中,我们通过exit()或_exit()来结束当前进程 exit...
  • 关于exit函数

    2014-05-13 16:35:45
    exit函数
  • 结果如下,经过main函数中的printf才结束。 如果将信号捕捉函数中的exit添加上 整个父进程就会在信号处理函数中终止,而不经过main函数中的exit.
  • exit函数和return函数

    2010-05-09 18:53:00
    1、exit函数和return函数的主要区别是:1)exit用于在程序运行的过程中随时结束程序,exit的参数是返回给OS的。main函数结束时也会隐式地调用exit函数exit函数运行时首先会执行由atexit()函数登记的函数,然后会做...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 202,495
精华内容 80,998
关键字:

结束函数exit