[7 进程环境]使用atexit函数注册终止处理函数

2024-08-21 16:32

本文主要是介绍[7 进程环境]使用atexit函数注册终止处理函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

下图显示了一个C程序是如何启动和正常关闭的:

图1 C程序是如何启动和正常关闭的

1 启动

C程序总是从main函数开始执行,内核是通过exec函数调用一个C启动例程再调用的main函数。C启动例程从内核获取命令行参数和环境变量,为调用main函数做好准备。

2 关闭

有8种方式可以使进程关闭,5种正常终止,3种异常终止。
正常终止:
(1)从main返回
(2)调用exit
(3)调用_exit或_Exit
(4)最后一个线程从C启动例程返回
(5)最后一个线程调用phtread_exit()
异常终止:
(1)调用abort
(2)接收一个信号
(3)最后一个线程对取消请求做出响应
这里先介绍两个方式。

2.1 _exit或_Exit

_exit或_Exit会立即进入内核。

2.2 exit

exit会首先条用atexit注册的终止处理函数,然后通过fclose关闭所有打开流,最后进入内核。
atexit函数:

#include <stdlib.h>
//ret:success返回0; fail返回非0
int atexit(void (*func)(void));

atexit函数注册终止处理程序,这些函数将由exit自动调用,调用的顺序与注册时顺序相反,同一函数如果注册多次也会被调用多次。一个进程最多注册32个终止处理函数。

3 使用atexit函数注册终止处理函数

#include <stdlib.h>
#include <stdio.h>static void    my_exit1(void);
static void    my_exit2(void);int main(void)
{if (atexit(my_exit2) != 0)printf("can't register my_exit2");if (atexit(my_exit1) != 0)printf("can't register my_exit1");if (atexit(my_exit1) != 0)printf("can't register my_exit1");printf("main is done\n");return(0);
}static void my_exit1(void)
{printf("first exit handler\n");
}static void my_exit2(void)
{printf("second exit handler\n");
}

输出:

main is done
first exit handler
first exit handler
second exit handler

调用的顺序与注册时顺序相反,同一函数如果注册多次也会被调用多次。

这篇关于[7 进程环境]使用atexit函数注册终止处理函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1093688

相关文章

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

如何使用Python实现一个简单的window任务管理器

《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用Python实现一个简单的window任务管理器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 任务管理器效果图完整代码import tkinter as tkfrom tkinter i

使用PyTorch实现手写数字识别功能

《使用PyTorch实现手写数字识别功能》在人工智能的世界里,计算机视觉是最具魅力的领域之一,通过PyTorch这一强大的深度学习框架,我们将在经典的MNIST数据集上,见证一个神经网络从零开始学会识... 目录当计算机学会“看”数字搭建开发环境MNIST数据集解析1. 认识手写数字数据库2. 数据预处理的

SpringBoot @Scheduled Cron表达式使用方式

《SpringBoot@ScheduledCron表达式使用方式》:本文主要介绍SpringBoot@ScheduledCron表达式使用方式,具有很好的参考价值,希望对大家有所帮助,如有... 目录Cron 表达式详解1. 表达式格式‌2. 特殊字符解析3. 常用示例‌4. 重点规则5. 动态与复杂场景‌

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

java String.join()的使用小结

《javaString.join()的使用小结》String.join()是Java8引入的一个实用方法,用于将多个字符串按照指定分隔符连接成一个字符串,本文主要介绍了javaString.join... 目录1. 方法定义2. 基本用法2.1 拼接多个字符串2.2 拼接集合中的字符串3. 使用场景和示例3

使用Python和python-pptx构建Markdown到PowerPoint转换器

《使用Python和python-pptx构建Markdown到PowerPoint转换器》在这篇博客中,我们将深入分析一个使用Python开发的应用程序,该程序可以将Markdown文件转换为Pow... 目录引言应用概述代码结构与分析1. 类定义与初始化2. 事件处理3. Markdown 处理4. 转

SpringBoot3使用Jasypt实现加密配置文件

《SpringBoot3使用Jasypt实现加密配置文件》这篇文章主要为大家详细介绍了SpringBoot3如何使用Jasypt实现加密配置文件功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编... 目录一. 使用步骤1. 添加依赖2.配置加密密码3. 加密敏感信息4. 将加密信息存储到配置文件中5

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

使用DrissionPage控制360浏览器的完美解决方案

《使用DrissionPage控制360浏览器的完美解决方案》在网页自动化领域,经常遇到需要保持登录状态、保留Cookie等场景,今天要分享的方案可以完美解决这个问题:使用DrissionPage直接... 目录完整代码引言为什么要使用已有用户数据?核心代码实现1. 导入必要模块2. 关键配置(重点!)3.