atexit()函数】的更多相关文章

atexit函数 atexit函数的原型如下 void atexit(void (*func)(void)) 它是一个参数为返回值和参数均为空的函数指针的函数,含义是当前进程结束之前执行参数函数指针所指向的函数,使用的时候要在main中注册,一次可以注册很多函数,函数的执行顺序与注册的先后有关,关系恰好相反,第一个注册的函数反而是最后一个执行.下面是执行实例. #include<stdio.h> #include<stdlib.h> void func1() { printf(&q…
很多时候我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,比如main()函数运行结束.在程序的某个地方用exit()结束程序.用户通过Ctrl+C或Ctrl+break操作来终止程序等等,因此需要有一种与程序退出方式无关的方法来进行程序退出时的必要处理.方法就是用atexit()函数来注册程序正常终止时要被调用的函数. atexit()函数的参数是一个函数指针,函数指针指向一个没有参数也没有返回值的函数.atexit()的函数原型是:#include <cstdlib…
atexit()函数  头文件:#include<stdlib.h> 功 能: 注册终止函数(即main执行结束后调用的函数) 用 法: int atexit(void (*func)(void)); 注意:按照ISO C的规定,一个进程可以登记多达32个函数,这些函数将由exit自动调用.atexit()注册的函数类型应为不接受任何参数的void函数,exit调用这些注册函数的顺序与它们登记时候的顺序相反.同一个函数如若登记多次,则也会被调用多次. 例: 运行结果:…
摘要:本文主要讲述进程的终止方式,以及怎样使用exit()函数来终止进程.回收进程用户空间资源:分析了exit()函数与_exit()函数,returnkeyword的差异.同一时候具体解读了怎样使用atexit()和on_exit()函数来注冊终止处理程序. 进程终止.回收资源 1.进程终止方式 在内核中,程序运行的唯一方法是调用一个exec函数.而进程自愿终止的唯一方法是显示或隐式地调用_exit()或_Exit().     进程有5种正常终止方式: (1)常见的一种是,在main函数中运…
按照ISO C的规定,一个进程可以登记多达32个函数,这些函数将由exit自动调用,通常这32个函数被称为终止处理程序,并调用atexit函数来登记这些函数. 我们通常认为C语言的起始函数是main函数,实质上一个程序的启动函数并不一定是main函数,这个可以采用链接器来设置,但是gcc中默认main就是C语言的入口函数,在main函数启动之前,内核会调用一个特殊的启动例程,这个启动例程从内核中取得命令行参数值和环境变量值,为调用main函数做好准备,因此对应程序而言main函数并不是起始,但是…
对C语言有所了解的人都知道main函数是整个程序的入口,但是其实不然,在内核中可以使用链接器来设置程序的开始地方.当内核使⽤⼀个exec函数执⾏C程序时,在调⽤main函数之前先调⽤⼀个特殊的启动例程,可执⾏程序将此例程指定为程序的起始地址.启动例程从内核获取命令⾏参数和环境变量,然后为调⽤main函数做好准备. 前面我们关注的是程序开始进入时的调用函数,而atexit函数是一个特殊的函数,它是在正常程序退出时调用的函数,我们把他叫为登记函数 (函数原型:int atexit (void (*)…
使用该函数注册的退出函数是在进程正常退出时,才会被调用.这里强调是进程正常退出,使用exit退出或使用main中最后的return语句退出.但如果是因为收到信号signal而导致程序退出,如kill pid,那么atexit所注册的函数将不会被调用.而当进程收到信号时,如果没有注册函数去处理对应的信号,那么内核就会执行信号的默认动作,一般就是直接终止进程.这个时候,进程的退出完全由内核来完成,自然就不会调用到C库的exit函数了,从而也就无法调用注册的退出函数了. 下面是一个atexit的例子-…
一,进程终止有5种方式: 正常退出: 从main函数返回 调用exit 调用_exit 异常退出: 调用abort 由信号终止 二,exit和_exit区别: 关于_exit(): #include <unistd.h> void _exit(int status); #include <stdlib.h> void _Exit(int status); DESCRIPTION        The function _exit() terminates the calling p…
函数名: atexit 头文件:#include<stdlib.h> 功 能: 注册终止函数(即main执行结束后调用的函数) 用 法: void atexit(void (*func)(void)); 注意:exit调用这些注册函数的顺序与它们 登记时候的顺序相反.同一个函数如若登记多次,则也会被调用多次. #include <stdio.h> #include <stdlib.h> static void my_exit1(void); static void my…
#include "apue.h" static void my_exit1(void); static void my_exit2(void); int main(void) { ; ret = atexit(my_exit2); ) err_sys("can't not register my_exit2\r\n"); ret = atexit(my_exit1); ) err_sys("can't not register my_exit1\r\n&…
跟atexit函数相识已久,man手册里对atexit的解释是这么一段: The atexit() function registers the given function to be called at normal process termination, either via exit() or via return from the program’s main(). Functions so registered are called in the reverse order of…
函数说明: 1.原型:int atexit (void (*func)(void)); 2.功能:注册退出main函数之后将要被执行的函数: 3.参考:http://www.cplusplus.com/reference/cstdlib/atexit/ 4.头文件:stdlib.h 关键点说明: 1.被注册函数不能带参数,也不能有返回值: 2.被注册函数的调用顺序与注册顺序相反: 3.atexit函数可以在被注册函数中再次注册其他函数,但是这种行为是未定义的: 4.可以多次调用atexit函数注…
进程终⽌的⽅式有8种,前5种为正常终⽌,后三种为异常终⽌: 1. 从main函数返回: 2 .调⽤exit函数:3 .调⽤_exit或_Exit:4 .最后⼀个线程从启动例程返回:5 .最后⼀个线程调⽤pthread_exit:6 .调⽤abort函数:7 .接到⼀个信号并终⽌:8 .最后⼀个线程对取消请求做出响应. atexit() 函数:注册终止函数 即main执行结束后调用的函数.它的原型是一个返回值为空,参数为返回值为空的函数指针,void atexit(void (*func)(voi…
1. 关于代码覆盖率 衡量代码覆盖率有很多种层次,比如行覆盖率,函数/方法覆盖率,类覆盖率,分支覆盖率等等.代码覆盖率也是衡量测试质量的一个重要标准,对于黑盒测试来说,如果你不确定自己的测试用例是否真正跑过了系统里面的每一行代码,在测试的完整性上总要打些折扣.因此,业界几乎对各种编程语言都有自己的一套代码覆盖率解决方案.世界上最美的语言PHP当然也不例外.PHPUnit和Spike PHPCoverage提供了一套基于xdebug的代码覆盖率测试方案.在本文中,我将针对自己碰到的特定业务场景,讲…
注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXIT_SUCCESS);可读性比较好一点. 作为系统调用而言,_exit和exit是一对孪生兄弟,它们究竟相似到什么程度,我们可以从Linux的源码中找到答案: #define __NR__exit __NR_exit /* 摘自文件include/asm-i386/unistd.h第334行 */…
这几个函数都在头文件#include <stdlib.h>中声明.exit._Exit与abort函数使程序终止,控制并不返回到这些函数的调用者. exit()函数 void exit(intstate); exit()函数用于在程序运行的过程中随时结束程序,exit的参数state是返回给操作系统,返回0表示程序正常结束,非0表示程序非正常结束.main函数结束时也会隐式地调用exit函数.exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有…
man vfork: NAME vfork - create a child process and block parent SYNOPSIS #include <sys/types.h> #include <unistd.h> pid_t vfork(void); DESCRIPTION Standard description (From POSIX.1) The vfork() function has the same effect as fork(2), except…
进程有下面5种正常终止方式: (1)在main函数内执行return语句.这等效于调用exit. (2)调用exit函数.此函数有ISO C定义,其操作包括调用各终止处理程序(终止处理程序在调用atexit函数时登记),然后关闭所有标准I/O流等. (3)调用_exit或_Exit函数.ISO C定义_Exit,其目的是为进程提供一种无需运行终止处理程序或信号处理程序而终止的方法.对标准I/O流是否进行冲洗,这取决于实现.在UNIX系统中,_Exit和_exit是同义的,并不清洗标准I/O流._…
第1章 unix基础知识 1. char *strerror(int errnum) 该函数将errnum(就是errno值)映射为一个出错信息字符串,返回该字符串指针.声明在string.h文件中. 2.void perror(const char *s) 该函数基于当前的errno值,在标准出错文件中输出一条出错消息,然后返回.声明在stdio.h文件中.它首先输出由s指向的字符串,然后是一个冒号,一个空格,接着是errno值对应的出错信息,最后是一个换行符. 第2章 UNIX标准化及实现…
在C语言的标准库<stdlib.h>中提供了一些与正常或者不正常的程序终止有关的函数,下面分别对其进行简单介绍. 参考文献: [1] C和指针,P298,342 [2] C程序设计语言现代方法(第2版),P489 [3] atexit函数和exit函数的理解 1 abort() abort()函数用于不正常地终止一个正在执行的程序.函数原型如下: void abort(void) 这个函数将引发SIGABRT信号,你可以在程序中为这个信号设置一个信号处理函数,在程序终止(或干脆不终止)之前采取…
本文中提到的函数库有:<string> <cctype> <algorithm> <cmath> <cstdlib> <iomanip> <numeric> 1.   标准C++库字符串类std::string的用法 begin       得到指向字符串开头的Iterator end         得到指向字符串结尾的Iterator rbegin      得到指向反向字符串开头的Iterator rend     …
exit会做一些释放工作:释放所有的静态的全局的对象,缓存,关掉所有的I/O通道,然后终止程序.如果有函数通过atexit来注册,还会调用注册的函数.不过,如果atexit函数扔出异常的话,就会直接调用terminate. abort:立刻terminate程序,没有任何清理工作.…
引用 exit.return._exit._Exit这几个函数的区别 一.exit函数和return函数的主要区别是: exit用于在程序运行的过程中随时结束程序,其参数是返回给OS的.也可以这么讲:exit函数是退出应用程序,并将应用程序的一个状态返回给OS,这个状态标识了应用程序的一些运行信息. main函数结束时也会隐式地调用exit函数,exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流.关闭所有打开的流并且关闭通过标准I/O函数…
main函数代表进程的主线程.程序开始执行时,系统为程序创建一个进程,main函数其实并不是首先被调用的函数,而是操作系统调用了C/C++运行期启动函数,该函数负责对C/C++ 运行期库进行初始化.它还能够保证已经声明了的任何全局对象和静态对象能够在代码执行之前正确的创建. 完成这些工作之后,就调用进入点函数(控制台程序为main函数),并在main函数里面执行一系列操作. 在main函数执行完毕后,从mian函数返回,启动函数调用C运行期的exit()函数,将返回值传递给它.其中在exit()…
1.标准C++库字符串类std::string的用法 begin       得到指向字符串开头的Iterator end       得到指向字符串结尾的Iterator rbegin       得到指向反向字符串开头的Iterator rend       得到指向反向字符串结尾的Iterator size       得到字符串的大小 length()       和size函数功能相同 max_size       字符串可能的最大大小 capacity       在不重新分配内存的…
1. 入口函数和程序初始化 1.1 程序从main开始吗? 当程序执行到main函数的第一行时,很多事情都已经完成了: [证1]如下是一段C语言代码: 代码中可以看到,在程序刚刚执行到main的时候,全局变量的初始化过程已经结束了(a的值已经确定): main函数的两个参数(argc 和 argv)也被正确的传了进来: 此外,堆和栈的初始化 已经完成: 一些 系统I/O 也被初始化了,因此,可以放心的使用printf和malloc. [证2]如下是一段C++ 代码,main之前能够执行的代码还会…
mian()主函数执行完毕后,是否可能会再执行一段代码?如果需要加入一段代码在mian退出后执行的代码,可以使用atexit()函数注册一个函数,代码如下: #include <iostream> #include <stdlib.h> int atexit(void (*function)(void)); using namespace std; void f1(void),f2(void); int main() { atexit(f1); atexit(f2); cout &…
#include <stdio.h> // void perror(const char *msg); #include <string.h> // char *strerror(int errnum); #include <errno.h> //errno   errno 是错误代码,在 errno.h头文件中: perror是错误输出函数,输出格式为:msg:errno对应的错误信息(加上一个换行符): strerror 是通过参数 errnum (就是errno)…
pthread_kill: pthread_kill与kill有区别,是向线程发送signal.,大部分signal的默认动作是终止进程的运行,所以,我们才要用signal()去抓信号并加上处理函数. int pthread_kill(pthread_t thread, int sig); 向指定ID的线程发送sig信号,如果线程代码内不做处理,则按照信号默认的行为影响整个进程,也就是说,如果你给一个线程发送了SIGQUIT,但线程却没有实现signal处理函数,则整个进程退出. pthread…
/************************************************** 相关函数: #include <pthread.h> int pthread_cancel(pthread_t thread) 成功返回0,失败返回错误码 **************************************************/ 此函数是POSIX提供的用于取消同一进程中的其它线程,此函 数只发送取消请求,并不等待要取消的进程退出!线程可以 选择忽略或是选择其它…