浅析exit()和atexit()函数
当内核使用一个一个exec函数执行c程序时,在调用main函数之前先调用一个特殊的启动例程,可执行程序需将此例程指定为程序的起始地址。启动例程从内核获取命令行参数和环境变量,然后为调用mian函数做好准备。
exec函数说明:
fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新程序的内容替换了。另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行脚本文件。
那么在linux中调用exec函数有两种情况:
1)当进程认为自己不能再为系统和用户做出任何贡献时,就可以调用任何exec 函数族让自己重生。
2)如果一个进程想执行另一个程序,那么它就可以调用fork函数新建一个进程,然后调用任何一个exec函数使子进程重生。
进程终止:
进程种植的方式有8种,前5种为正常终止,后3种为异常终止:
1 从main函数返回
2 调⽤用exit函数;
3 调⽤用_exit或_Exit;
4 最后⼀一个线程从启动例程返回;
5 最后⼀一个线程调⽤用pthread_exit;
6 调⽤用abort函数;
7 接到⼀一个信号并终⽌止;
8 最后⼀一个线程对取消请求做出响应。
一般我们都是使用exit函数正常终止进程
#include <stdlib.h>
void exit( int status );
void _Exit( int status );
#include <unistd.h>
void _exit( int status );
_exit和_Exit立即进入内核,而exit要先做一些清理工作(调用执行个终止处理程序,关闭所有标准I/O流),再进入内核。三个函数所带的整形参数称为终止状态或退出状态,如果(a)调用这些函数不带参数,(b)main函数中的return 语句无返回值,(c)main函数没有声明返回类型为整形,则进程的终止状态是未定义的。main函数返回一个整形值与用该值调用exit是等价的。
注意:
exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流、关闭所有打开的流并且关闭通过标准I/O函数tmpfile()创建的临时文件。
exit()函数用于在程序运行的过程中随时结束程序,exit的参数state是返回给操作系统,返回0表示程序正常结束,非0表示程序非正常结束。
atexit函数:
atexit函数是一个特殊的函数,它是在正常程序退出时调用的函数,我们把他叫为登记函数
(函数原型:int atexit (void (*)(void)))
⼀一个进程可以登记若32个函数,这些函数由exit自动调用,这些函数被称为终止处理函数,atexit函数可以登记这些函数。exit调用终止处理函数的顺序和atexit登记的顺序相反,如果一个函数被多次登记,也会被多次调用。
验证atexit函数:
运行结果为:
先打印hello main睡眠五秒再依次打印test5,test4,test3,test2,test1(如果main函数中printf部分不加\n,则main函数要输出的内容会先放到标准输出缓冲区中,睡眠5秒后再打印出来,当main中调用exit函数的时候,会做一些自身清理工作,同时刷新标准输出缓冲区中的内容),当执行到exit(0)时,exit会自动调用已注册过的函数,但是由于压栈过程中先进后出的原则,所以先注册的函数最后执行。如果一个函数被atexit()登记多次也会被exit()调用多次。
浅析exit()和atexit()函数相关推荐
- C语言通用工具库之exit()和atexit()函数
一.exit()和atexit()函数 exit()退出程序.在main()函数返回系统时将自动调用exit()函数. atexit()函数通过退出时注册被调用的函数提供这种功能,atexit()接受 ...
- C++中Exit()与atexit()函数的使用
来源:http://blog.sina.com.cn/s/blog_5cec5bad0100b0x2.html 一.exit()函数 函数声明:void exit(int state); exit() ...
- 出错处理函数abort、exit、atexit、strerror
出错处理函数abort.exit.atexit.strerror. . .2010-06-30 22:43摘要:本文详细讲述了几个出错处理的函数abort.exit.atexit.strerror函数 ...
- atexit()函数
原文: http://www.cnblogs.com/wanghetao/archive/2012/04/03/2431256.html ------------------------------- ...
- exit()与_exit()函数的区别
注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXI ...
- atexit()函数(进程退出函数,类似析构)
atexit函数: atexit函数是一个特殊的函数,它是在正常程序退出时调用的函数,我们把他叫为登记函数 (函数原型:int atexit (void (*)(void))) 一个进程可以登记若 ...
- 对atexit函数的理解
函数名: atexit 头文件:#include<stdlib.h> 功 能: 注册终止函数(即main执行结束后调用的函数) 用 法: void atexit(void (*func)( ...
- atexit函数详解
对C语言有所了解的人都知道main函数是整个程序的入口,但是其实不然,在内核中可以使用链接器来设置程序的开始地方.当内核使⽤⼀个exec函数执⾏C程序时,在调⽤main函数之前先调⽤⼀个特殊的启动例程 ...
- exit()与_exit()函数的区别(Linux系统中)
注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXI ...
最新文章
- AI促进药物发现:未来是多细胞研究
- 【CTF】paradigm-CTF babysandbox
- python描述器 有限状态机_笨办法学 Python · 续 练习 30:有限状态机
- 人工智能 对比试验_人工智能与药物研发
- Java运算符(Operator)之 算数运算符(ArithmeticOperator)
- Spring Boot配置文件application.properties
- Asp.Net IHttpHandler介绍
- udp程序启动后检测都是未启动_【例子教程】联想Leez P710 物联网AI物体检测
- java程序设计精编教程第3版电子版课后答案_Java程序设计精编教程-(第3版)-微课版...
- 软件测试实例——总结
- 黑客老王:一个人的黑客史
- 物品领用 系统 php,EXCEL物品管理系统V1.0(开放源码)
- linkboy带你点亮LED创意世界
- 牡丹-洛阳牡丹:洛阳牡丹
- IPS(Intrusion Prevention System)入侵防护系统原理
- java fx 教程_JavaFX快速入门
- div box盒子的一些概念
- 电脑中病毒了怎么修复?电脑中病毒了怎么办?
- unity 制作插件
- stata画时间趋势图时横坐标标签太长重叠怎么办