当内核使用一个一个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()函数相关推荐

  1. C语言通用工具库之exit()和atexit()函数

    一.exit()和atexit()函数 exit()退出程序.在main()函数返回系统时将自动调用exit()函数. atexit()函数通过退出时注册被调用的函数提供这种功能,atexit()接受 ...

  2. C++中Exit()与atexit()函数的使用

    来源:http://blog.sina.com.cn/s/blog_5cec5bad0100b0x2.html 一.exit()函数 函数声明:void exit(int state); exit() ...

  3. 出错处理函数abort、exit、atexit、strerror

    出错处理函数abort.exit.atexit.strerror. . .2010-06-30 22:43摘要:本文详细讲述了几个出错处理的函数abort.exit.atexit.strerror函数 ...

  4. atexit()函数

    原文: http://www.cnblogs.com/wanghetao/archive/2012/04/03/2431256.html ------------------------------- ...

  5. exit()与_exit()函数的区别

    注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXI ...

  6. atexit()函数(进程退出函数,类似析构)

    atexit函数:  atexit函数是一个特殊的函数,它是在正常程序退出时调用的函数,我们把他叫为登记函数  (函数原型:int atexit (void (*)(void))) 一个进程可以登记若 ...

  7. 对atexit函数的理解

    函数名: atexit 头文件:#include<stdlib.h> 功 能: 注册终止函数(即main执行结束后调用的函数) 用 法: void atexit(void (*func)( ...

  8. atexit函数详解

    对C语言有所了解的人都知道main函数是整个程序的入口,但是其实不然,在内核中可以使用链接器来设置程序的开始地方.当内核使⽤⼀个exec函数执⾏C程序时,在调⽤main函数之前先调⽤⼀个特殊的启动例程 ...

  9. exit()与_exit()函数的区别(Linux系统中)

    注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXI ...

最新文章

  1. AI促进药物发现:未来是多细胞研究
  2. 【CTF】paradigm-CTF babysandbox
  3. python描述器 有限状态机_笨办法学 Python · 续 练习 30:有限状态机
  4. 人工智能 对比试验_人工智能与药物研发
  5. Java运算符(Operator)之 算数运算符(ArithmeticOperator)
  6. Spring Boot配置文件application.properties
  7. Asp.Net IHttpHandler介绍
  8. udp程序启动后检测都是未启动_【例子教程】联想Leez P710 物联网AI物体检测
  9. java程序设计精编教程第3版电子版课后答案_Java程序设计精编教程-(第3版)-微课版...
  10. 软件测试实例——总结
  11. 黑客老王:一个人的黑客史
  12. 物品领用 系统 php,EXCEL物品管理系统V1.0(开放源码)
  13. linkboy带你点亮LED创意世界
  14. 牡丹-洛阳牡丹:洛阳牡丹
  15. IPS(Intrusion Prevention System)入侵防护系统原理
  16. java fx 教程_JavaFX快速入门
  17. div box盒子的一些概念
  18. 电脑中病毒了怎么修复?电脑中病毒了怎么办?
  19. unity 制作插件
  20. stata画时间趋势图时横坐标标签太长重叠怎么办

热门文章

  1. python替换文本
  2. pwn题堆利用的一些姿势 -- IO_FILE
  3. 简单三步快速远程桌面公司内网电脑【免费内网穿透】
  4. Android部分手机在使用EditText进行自动联想时会先输入拼音的问题
  5. 串口工具secureCRT使用技巧分享(1):命令行窗口
  6. Hack The Box——Remote
  7. 元素和子集,属于与包含
  8. 【236】Python求列表最长字符串及lambda和最长公共子串
  9. C++异常之栈解旋(unwinding)
  10. ContentProvider使用Demo