atexit函数

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

    函数的正常结束时候调用。当一个函数被kill命令杀死,或是使用其他方式总结如ctrl+C方式终结时,这个是不被调用的。

SYNOPSIS
       #include <stdlib.h>

int atexit(void (*function)(void));

DESCRIPTION
       The atexit() function registers the given function to be called at nor‐
       mal process termination, either via exit(3) or via return from the pro‐
       gram‘s main().  Functions so registered are called in the reverse order
       of their registration; no arguments are passed.
       调用时注册的反向调用。C++的析构函数和构造函数就是与这个类似,估计C++多少受到这个影响。
       The same function may be registered multiple times: it is  called  once
       for each registration.

POSIX.1-2001  requires that an implementation allow at least ATEXIT_MAX
       (32) such functions to be registered.  The actual limit supported by an
       implementation can be obtained using sysconf(3).

When  a child process is created via fork(2), it inherits copies of its
       parent‘s registrations.  Upon a successful call to one of  the  exec(3)
       functions, all registrations are removed.

RETURN VALUE
       The  atexit()  function returns the value 0 if successful; otherwise it
       returns a nonzero value.

#include"apue.h"
static void my_exit1(void);
static void my_exit2(void);

int main()
{
    if(atexit(my_exit2) != 0)
        err_sys("can not register my_exit2\n");
    if(atexit(my_exit1) != 0)
        err_sys("can not register my_exit1\n");
    if(atexit(my_exit1) != 0)
        err_sys("can not register my_exit1\n");
    printf("main is done\n");
    while(1);
    return 0;

    printf("main has exited!\n");

}
static void my_exit1(void){
    printf("first exit handler\n");
}
static void my_exit2(void){
    printf("second exit handler\n");
}

该程序使用Ctrl+C或是kill命令杀死上述程序的时候,没有任何注册函数的打印信息。

该函数作为很好的一个调试接口或是很好定位手段。

时间: 2024-11-21 04:42:04

atexit函数的相关文章

C/C++程序终止时执行的函数——atexit()函数详解

很多时候我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,比如main()函数运行结束.在程序的某个地方用exit()结束程序.用户通过Ctrl+C或Ctrl+break操作来终止程序等等,因此需要有一种与程序退出方式无关的方法来进行程序退出时的必要处理.方法就是用atexit()函数来注册程序正常终止时要被调用的函数. atexit()函数的参数是一个函数指针,函数指针指向一个没有参数也没有返回值的函数.atexit()的函数原型是:#include <cstdlib

关于atexit函数

按照规定,一个进程可以登记多至32个函数,这些函数将有exit自动调用.我们称这些函数为终止处理程序,并调用atexit函数来登记这些函数. 头文件和参数: #include <stdlib.h> int atexit(void (*fun)(void)); 它的参数是一函数指针.exit调用这些函数的顺序与它们登记时候的顺序相反. 首先登记这10个函数,然后结束时,按照相反的顺序调用这些终止处理程序.

atexit函数和exit函数的理解

p { margin-bottom: 0.25cm; line-height: 120% } 按照ISO C的规定,一个进程可以登记多达32个函数,这些函数将由exit自动调用,通常这32个函数被称为终止处理程序,并调用atexit函数来登记这些函数. 我们通常认为C语言的起始函数是main函数,实质上一个程序的启动函数并不一定是main函数,这个可以采用链接器来设置,但是gcc中默认main就是C语言的入口函数,在main函数启动之前,内核会调用一个特殊的启动例程,这个启动例程从内核中取得命令

atexit()函数

atexit()函数  头文件:#include<stdlib.h> 功 能: 注册终止函数(即main执行结束后调用的函数) 用 法: int atexit(void (*func)(void)); 注意:按照ISO C的规定,一个进程可以登记多达32个函数,这些函数将由exit自动调用.atexit()注册的函数类型应为不接受任何参数的void函数,exit调用这些注册函数的顺序与它们登记时候的顺序相反.同一个函数如若登记多次,则也会被调用多次. 例: 运行结果:

atexit函数和两种特殊文件权限位

atexit函数 atexit函数的原型如下 void atexit(void (*func)(void)) 它是一个参数为返回值和参数均为空的函数指针的函数,含义是当前进程结束之前执行参数函数指针所指向的函数,使用的时候要在main中注册,一次可以注册很多函数,函数的执行顺序与注册的先后有关,关系恰好相反,第一个注册的函数反而是最后一个执行.下面是执行实例. 1 #include<stdio.h> 2 #include<stdlib.h> 3 4 5 void func1() 6

回收进程用户空间资源 exit()函数 _exit()函数 atexit()函数 on_exit()函数

摘要:本文主要讲述进程的终止方式,以及如何使用exit()函数来终止进程,回收进程用户空间资源:分析了exit()函数与_exit()函数,return关键字的差异.同时详细解读了如何使用atexit()和on_exit()函数来注册终止处理程序. 进程终止.回收资源 1.进程终止方式 在内核中,程序执行的唯一方法是调用一个exec函数.而进程自愿终止的唯一方法是显示或隐式地调用_exit()或_Exit(). 进程有5种正常终止方式: (1)常见的一种是,在main函数中执行return语句,

进程环境详解(二)---进程终止和 atexit 函数详解

进程终止可以分为 进程正常终止 和 进程异常终止 . 进程正常终止有以下几种情况: 在 main 函数返回 调用 exit 函数 调用 _exit 或者 _Exit 函数 最后一个线程从启动代码中返回 最后一个线程调用 pthread_exit 进程异常终止有以下几种情况: 调用 abort函数 进程收到信号终止 最后一个线程对取消请求作出响应 ======================================================== exit 函数 和 _exit / _

atexit函数详解

对C语言有所了解的人都知道main函数是整个程序的入口,但是其实不然,在内核中可以使用链接器来设置程序的开始地方.当内核使??个exec函数执?C程序时,在调?main函数之前先调??个特殊的启动例程,可执?程序将此例程指定为程序的起始地址.启动例程从内核获取命令?参数和环境变量,然后为调?main函数做好准备. 前面我们关注的是程序开始进入时的调用函数,而atexit函数是一个特殊的函数,它是在正常程序退出时调用的函数,我们把他叫为登记函数 (函数原型:int atexit (void (*)

exit()函数和atexit()函数 复习

这样的函数有什么用途呢? 嘘~~~~ 上菜(代码)!! #include<stdio.h> #include<stdlib.h> void send (void); void failure(void); int main(void){ int n; atexit(send);//注册send()函数 puts("请输入数字:"):if(scanf("%d",&n)!=1) { puts(" No integer"