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结束以后被调用,看名字就可以看出来。

时间: 2024-10-26 11:30:44

atexit() 与 exit()函数的相关文章

atexit函数和exit函数的理解

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

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

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

进程终止和exit函数

内核要执行一个应用程序,唯一的途径是通过系统调用,exec函数,exec又会调用启动程序,启动程序(通常是汇编语言)以类似下面的方式调用main函数: void exit(main(argc, argv)); 那么在main函数末尾使用exit(0)和使用return 0是等价的.这里有三个正常终止程序的函数: void exit(int status); // 先执行一些清理操作,然后进入内核 void _Exit(int status); // 立即进入内核,可在所有函数中调用 void _

进程操作篇atexit execl exit fprintf fscanf getpid nice get priority printf setpid system vfork wait waitpid

atexit(设置程序正常结束前调用的函数) 相关函数 _exit,exit,on_exit 表头文件 #include<stdlib.h> 定义函数 int atexit (void (*function)(void)); 函数说明 atexit()用来设置一个程序正常结束前调用的函数.当程序通过调用exit()或从main中返回时,参数function所指定的函数会先被调用,然后才真正由exit()结束程序. 返回值 如果执行成功则返回0,否则返回-1,失败原因存于errno中. 范例 #

(转)C语言中Exit函数的使用

C语言中Exit函数的使用 exit() 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束return() 是当前函数返回,当然如果是在主函数main, 自然也就结束当前进程了,如果不是,那就是退回上一层调用.在多个进程时.如果有时要检测上进程是否正常退出的.就要用到上个进程的返回值.. exit(1)表示进程正常退出. 返回 1;exit(0)表示进程非正常退出. 返回 0.进程环境与进程控制(1): 进程的开始与终止 1. 进程的开始:C程序是从main函数开始执行, 原

C/C++中的abort、atexit、exit和_Exit

这几个函数都在头文件#include <stdlib.h>中声明.exit._Exit与abort函数使程序终止,控制并不返回到这些函数的调用者. exit()函数 void exit(intstate); exit()函数用于在程序运行的过程中随时结束程序,exit的参数state是返回给操作系统,返回0表示程序正常结束,非0表示程序非正常结束.main函数结束时也会隐式地调用exit函数.exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有

return和exit函数的区别

在上Linux课的时候,老师提到一句,调用vfork产生的子进程就是为了使用exec族函数来执行其他的代码逻辑. 在子进程退出的时候有两种方式,exit和exec族函数,不能使用return,为什么不能用return呢,为什么只有vfork会不让用return呢? 于是我就写了这样的代码 1 #include<stdio.h> 2 #include<unistd.h> 3 #include<stdlib.h> 4 5 6 int main() 7 { 8 pid_t p

exit函数的妙用

写了一个程序,用来判断一个文件是否存在: #include<stdio.h> main() { FILE *fp; fp = fopen ("/home/wang/my/ct2.c", "r+"); if (fp == NULL) { printf("there is not this file!\n"); } else printf("the file is exist!\n"); fclose (fp); }

exit()函数

在代码中有时碰到: exit(0); 可也经常碰到: exit(1); 究竟exit()函数的参数0和1各自代表什么含义呢? 查看了MSDN后,明白了.对于exit()函数,其函数原型为: void exit( int status ); status的值为EXIT_SUCCESS(0)表示程序执行成功,正常退出:status的值为EXIT_FAILURE(1)表示程序执行失败,异常退出.尽管exit()函数的返回值为void型,但是操作系统可以获取status的值,知道程序执行的情况.