进程环境详解(二)---进程终止和 atexit 函数详解

进程终止可以分为 进程正常终止 和 进程异常终止 。

  • 进程正常终止有以下几种情况:
    • 在 main 函数返回
    • 调用 exit 函数
    • 调用 _exit 或者 _Exit 函数
    • 最后一个线程从启动代码中返回
    • 最后一个线程调用 pthread_exit
  • 进程异常终止有以下几种情况:
    • 调用 abort函数
    • 进程收到信号终止
    • 最后一个线程对取消请求作出响应

========================================================

exit 函数 和 _exit / _Exit 函数的区别就是:

  调用 exit 函数后并不会马上进入内核态,而是会先进行一些终止处理程序(使用atexit函数注册的函数),还会强制刷新所有的用户缓冲区等等。而_exit 和 _Exit 函数则是会立马进入到内核态中去执行内核处理,对用户缓冲区不予处理。在 exit 函数中也是封装了 _exit 或者 _Exit 函数。

  在 main 函数中使用 return 关键字和 调用 exit 函数是一模一样的。

========================================================

  atexit 函数的作用是用来注册函数,被注册的函数将会在调用 exit 函数或者在 main 函数中使用return关键字的时候会被执行。执行的顺序和调用的顺序是相反的。

函数原型:

函数参数:

  • function:函数指针

返回值:

  • 调用成功时返回 0
  • 调用失败时返回 非 0
时间: 2024-11-02 23:21:18

进程环境详解(二)---进程终止和 atexit 函数详解的相关文章

【C语言天天练(二十)】scanf函数详解

引言:scanf函数虽然是学习C语言时比较早就接触的一个函数,但在使用过程中,发现真正掌握它却并不容易.本文就通过各种例子来详细的总结一下该函数的各种用法,假设它的调用格式为 scanf("<格式化字符串>",<地址表>). 1.一般使用scanf函数时都是为某个变量赋值,不考虑它的返回值.但是任何函数都是需要返回的(即使返回类型用void,也可以认为只是调用了return语句,只是并没有返回什么东西而已),同样的scanf函数也是有返回的,它的返回值是成功读取

JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 exec方法的返回值 exec方法返回的其实并不是匹配结果字符串,而是一个对象,简单地修改一下execReg函数,来做一个实验就可以印证这一点: function execReg(reg, str) { var result = reg.exec(str); alert(typeof result

C/C++程序终止时执行的函数——atexit()函数详解

很多时候我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,比如main()函数运行结束.在程序的某个地方用exit()结束程序.用户通过Ctrl+C或Ctrl+break操作来终止程序等等,因此需要有一种与程序退出方式无关的方法来进行程序退出时的必要处理.方法就是用atexit()函数来注册程序正常终止时要被调用的函数. atexit()函数的参数是一个函数指针,函数指针指向一个没有参数也没有返回值的函数.atexit()的函数原型是:#include <cstdlib

atexit函数详解

对C语言有所了解的人都知道main函数是整个程序的入口,但是其实不然,在内核中可以使用链接器来设置程序的开始地方.当内核使??个exec函数执?C程序时,在调?main函数之前先调??个特殊的启动例程,可执?程序将此例程指定为程序的起始地址.启动例程从内核获取命令?参数和环境变量,然后为调?main函数做好准备. 前面我们关注的是程序开始进入时的调用函数,而atexit函数是一个特殊的函数,它是在正常程序退出时调用的函数,我们把他叫为登记函数 (函数原型:int atexit (void (*)

UNIX环境编程初步认识——进程

 前段时间学习了一些关于进程的一些知识,其中分为了三个部分:进程环境.进程关系.进程控制.下边是我做的思维导图和相关理解.由于缺乏实践,对于其中很多地方理解的还不够深入. 思维导图: 进程环境: 1.启动/终止:关于进程的环境,首先是对于进程整个环境的总体认识,通过分析C语言的启动和终止,讲解了关于进程是如何启动和终止的.2.环境表:说明了对于每个程序都会收到一张环境表.3.空间分配:对于空间分配,其中包括:对C程序中关于存储空间的布局安排,共享库的由来和执行方法,一些关于存储空间分配的函数

第7章 进程环境

main函数 main函数之前会有一个特殊的启动程序,启动例程从内核取得命令行参数和环境变量. 进程终止 正常终止: 从main函数返回 调用exit 调用_exit或_Exit 最后一个线程从启动例程返回 最后一个线程调用pthread_exit 异常终止: 调用abort 接到一个信号终止 最后一个线程对取消请求作出相应 exit函数 _exit和_Exit直接进入内核,exit则先执行一系列清理处理(调用终止处理程序,关闭所有标准io流),然后进入内核 #include<stdlib.h>

通过IsDebuggerPesent解说windows PEB进程环境块结构

首先介绍PEB和TEB概念: PEB(Process Environment Block.进程环境块)存放进程信息.每一个进程都有自己的PEB信息.位于用户地址空间. TEB(Thread Environment Block.线程环境块)系统在此TEB中保存频繁使用的线程相关的数据.位于用户地址空间.在比 PEB 所在地址低的地方. 进程中的每一个线程都有自己的一个TEB. 写一个使用IsDebuggerPesent函数的windows程序.用OD打开,断点IsDebuggerPesent函数

通过IsDebuggerPesent讲解windows PEB进程环境块结构

首先介绍PEB和TEB概念: PEB(Process Environment Block,进程环境块)存放进程信息,每个进程都有自己的PEB信息.位于用户地址空间. TEB(Thread Environment Block,线程环境块)系统在此TEB中保存频繁使用的线程相关的数据.位于用户地址空间,在比 PEB 所在地址低的地方.进程中的每个线程都有自己的一个TEB. 写一个使用IsDebuggerPesent函数的windows程序,用OD打开,断点IsDebuggerPesent函数 OD进

Linux进程上下文切换过程context_switch详解--Linux进程的管理与调度(二十一)【转】

转自:http://blog.csdn.net/gatieme/article/details/51872659 版权声明:本文为博主原创文章 && 转载请著名出处 @ http://blog.csdn.net/gatieme 目录(?)[-] 前景回顾 1 Linux的调度器组成 2 调度工作 进程上下文 1 进程上下文的概念 2 上下文切换 context_switch进程上下文切换 1 context_switch完全注释 2 prepare_arch_switch切换前的准备工作