精华内容
下载资源
问答
  • atexit

    2018-09-06 15:44:09
    atexit 测试 atexit  atexit用来注册在程序正常终止时调用的函数。    一个进程可以登记多达32个函数,这些函数将由exit自动调用。这些函数被称为“终止处理函数(exit handler)”,atexit函数负责登记...


    atexit

      atexit用来注册在程序正常终止时调用的函数。
      
      一个进程可以登记多达32个函数,这些函数将由exit自动调用。这些函数被称为“终止处理函数(exit handler)”,atexit函数负责登记这些函数。
      atexit的原型及所在头文件

    #include <stdlib.h>
    int atexit(void (*function)(void));

      atexit的参数function是一个函数指针,function不含任务参数,也不返回一个值。

    注:对于atexit的参数,我们如何确定其类型?
    首先,将变量名字拿掉,余下的部分就是其类型。即function的类型为void (*)(void)
    然后,由内而外看,function先与*结合,说明function是一个指针;
    而后与函数调用符”()”结合,说明其指向的是一个函数;
    参数列表中的void的,显示的指定该函数不需要参数;
    最后,最前面的void指明函数不需要返回一个值。
    因此,function是一个函数指针,它所指向函数的参数列表为空,返回类型为void。

      atexit的特性:

    1. exit调用这些函数的顺序与它们登记时候的顺序相反。
    2. 同一函数如若登记多次,则也会被调用多次。

    测试

      在测试文件中,main函数开始处先注册一个终止处理函数foo,再注册两个终止处理函数goo。

    #include <stdio.h>
    
    void foo()
    {
        printf("foo......\n");
    }
    
    void goo()
    {
        static int a = 0;
        printf("goo......%d\n", ++a);
    }
    
    int main(void)
    {
        atexit(foo);
        atexit(goo);
        atexit(goo);
        printf("main......\n");
    
        return 0;
    }

      编译后执行一下,看看效果:
    这里写图片描述
      可以看到,main函数流程结束后,exit分别调用了goo、goo和foo函数,调用顺序与它们的注册顺序相反。


      [注:由atexit的调用顺序想到的C++对象析构顺序]
      C++含类继承关系的对象,其析构顺序与此类型。
    这里写图片描述

      如有父类Parent和其子类Child。如有下面语句: 

    Child c;

      则先调用Parent的构造函数,再调用Child的构造函数;而析构时,则先调用Child的析构函数,再调用Parent的析构函数。

    展开全文
  • atexit简介

    2017-02-20 22:04:01
    atexit()在MSDN中信息 所在头文件: 函数原型: int atexit( void (__cdecl* func )( void )); 返回值: atexit returns 0 if successful, or a nonzero value if an error occursatexit成功返回0,失败返回一个非...

    当我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,比如main()函数运行结束、程序的某个地方使用exit()结束程序等等。我们需要些一种不受程序退出所影响的方法来进行程序退出时的必要操作。C语言中提供了atexit()函数来注册程序终止时要被调用的函数。


    可以在msdn搜索atexit或者Linux中使用man atexit命令来查询atexit的相关信息


    atexit简介:

    atexit - register a function to be called at normal process termination

    atexit()出处及其声明:

    #include <stdlib.h>
    
    int atexit(void (*function)(void));
    
    注意:参数为函数指针


    atexit简介:

    atexit()用来设置一个程序正常结束前调用的函数. 当程序通过调用exit()或从main 中返回时, 参数function 所指定的函数会先被调用, 然后才真正由exit()结束程序.

    也就是说,在一个程序中可以用atexit()注册几个处理函数(注册次数依赖于你的编译器),这些处理函数的调用顺序与其注册的顺序相反,也即最先注册的最后调用,最后注册的最先调用。


    返回值:

    成功返回0;失败返回一个非0值,并存在erron中。


    下面通过一个例子来展示一下:

    源代码:



    执行结果:



    现象:

    程序先输出了第22行的printf()函数,然后执行fn2()函数,最后执行fn1()函数程序,然后退出。


    原因:

    程序在执行时,遇见atexit()函数后,就注册该处理函数,然后继续往下执行。于是就注册了两个处理函数fn1()和fn2()。然后执行第22行的printf()函数。

    最后在程序即将退出时,逆序调用上面注册过的处理函数,也就是先调用fn2()函数,后调用fn1()函数,最后退出程序。

    展开全文
  • atexit函数

    2021-08-02 15:24:46
    int atexit(void (*function)(void)); 这个函数如同Java中的析构函数一样,先调用的后执行,后调用的先执行。 例子如下: #include <stdlib.h> #include <stdio.h> static void my_exit1(void),my_...
      #include <stdlib.h>
      int atexit(void (*function)(void));
    
    

    这个函数如同Java中的析构函数一样,先调用的后执行,后调用的先执行。
    例子如下:

    #include <stdlib.h>
    #include <stdio.h>
    static void my_exit1(void),my_exit2(void);
    int main(void){
    	if(atexit(my_exit2)!=0){
    		perror("error");
    	}
    	if(atexit(my_exit1)!=0){
    		perror("error");
    	}
    	if(atexit(my_exit1)!=0){
    		perror("error");
    	}
    	printf("main is done\n");
    	return 0;
    }
    static void my_exit1(void){
    	printf("first is done\n");
    }
    static void my_exit2(void){
    	printf("second is done\n");
    }
    
    

    运行如下:
    在这里插入图片描述

    展开全文
  • Python atexit

    千次阅读 2017-03-03 19:00:11
    atexit 模块用于注册解释器退出时执行的函数

    atexit 模块用于注册解释器退出时执行的函数。该模块只有一个方法:

    register(func [, args [, kwargs]])

    将函数func添加到解释器退出时要执行的函数列表中。函数以fun(*args, **kwargs)的形式被调用。

    In [1]: import atexit
    
    In [2]: def fun():
       ...:     print "exit Interpreter"
       ...:     
    
    In [3]: atexit.register(fun)
    Out[3]: <function __main__.fun>
    
    In [4]:                                                                                
    Do you really want to exit ([y]/n)? y
    exit Interpreter
    

    如果有多个函数注册,按注册顺序的逆序调用。

    展开全文
  • atexit 函数

    2019-09-19 23:24:13
    按照 ISO C 的规定,一个进程可以登记多达 32 个函数,这些函数将由 exit ...我们称这些函数为终止处理函数 (exit handler),并调用 atexit 函数来登记这些函数。 #include <stdlib.h> int atexit(void (*fu...
  • atexit Function

    2016-02-23 15:11:09
    这被称为exit handlers,可以通过调用atexit来注册。 atexit - register a function to be called at normal process termination#include <stdlib.h>int atexit(void (*function)(void)); //Returns
  • 函数atexit

    2019-10-06 12:08:59
    按照ISO C的规定,一个进程可以登记32个终止处理程序(exit handler),这些终止处理程序(即函数)将由exit自动调用,在exit自动调用之前,需要使用atexit函数登记这些函数。  以下是各实现提供的终止处理程序个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,242
精华内容 6,096
关键字:

atexit