atexit() 与 exit()函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了atexit() 与 exit()函数相关的知识,希望对你有一定的参考价值。

函数exit()


函数原型:

 技术分享   

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

  exit() 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束;

 exit(1)表示进程正常退出. 返回 1;

 exit(0)表示进程非正常退出. 返回 0.


atexit()函数

    按照ISO C的规定,一个进程可以登记多达32个函数,这些函数将由exit自动调用,通常这32个函数被称为终止处理程序,并调用atexit函数来登记这些函数。

    在程序退出时经常需要做一些诸如释放资源的操作,但程序退出的方式有很多种。因此需要一种与程序退出方式无关的方法来进行程序退出时的必要处理。atexit()函数用来注册程序正常终止时要被调用的函数。   

    

    下面看一下atexit()函数的原型:

技术分享

    atexit的参数是一个函数指针,当调用此函数时无须传递任何参数,该函数也不能返回值,atexit函数称为终止处理程序注册程序,注册完成以后,当函数终止时exit函数会主动的调用前面注册的各个函数,但是exit函数调用这些函数的顺序与这些函数登记的顺序是相反的,我认为这实质上是参数压栈造成的,参数由于压栈顺序而先入后出。同时如果一个函数被多次登记,那么该函数也将多次的执行。


代码段:

#include<stdio.h>
#include<atdlib.h>

void fun1(void)
{
    printf("fun1\n");
}

void fun2(void)
{
    printf("fun2\n");
}

void fun3(void)
{
    printf("fun3\n");
}

int main()
{
    atexit(fun1);
    atexit(fun2);
    atexit(fun3);
    
    printf("main\n");
}

程序运行结果输出是:

技术分享

    这些函数都是在main结束以后才被调用的。atexit只是注册他们,使得他们在main结束以后被调用,看名字就可以看出来。



本文出自 “七百七十七快” 博客,谢绝转载!

以上是关于atexit() 与 exit()函数的主要内容,如果未能解决你的问题,请参考以下文章

atexit函数和exit函数的理解

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

on_exit() 和 atexit() 函数之间有区别吗?

atexit函数的使用学习笔记

关于atexit函数

Linux - atexit()(注册终止)函数