linux进程退出之exit与_exit

linux进程退出之exit与_exit

  • _exit
  • exit
    • 流程
    • 清理函数
      • `atexit()`函数:
      • `on_exit()`函数:

_exit

/* Terminate program execution with the low-order 8 bits of STATUS.  */
/*
 * status参数定义了进程的终止状态,父进程可以通过wait()来获取该状态值。
 * 虽然status是int型,但是仅有低8位可以被父进程所用。
 */
extern void _exit (int __status) __attribute__ ((__noreturn__));

功能
调用_exit()函数会使程序立即退出,不会进行任何清理操作。用户调用_exit函数,本质上是调用exit_group系统调用。

exit

/* Call all functions registered with `atexit' and `on_exit',
   in the reverse of the order in which they were registered,
   perform stdio cleanup, and terminate program execution with STATUS.  */
/*
 1. exit()函数的最后也会调用_exit()函数,但是exit在调用_exit之前,还做了其他工作:
 2.   1)执行用户通过调用atexit函数或on_exit定义的清理函数。
 3.   2)关闭所有打开的流(stream),所有缓冲的数据均被写入(flush),通过tmpfile创建的临时文件都会被删除。
 4.   3)调用_exit。
 */
extern void exit (int __status) __THROW __attribute__ ((__noreturn__));

exit与_exit区别

流程

  1. 首先是exit函数会执行用户注册的清理函数。用户可以通过调用atexit()函数或on_exit()函数来定义清理函数。这些清理函数在调用return或调用exit时会被执行。执行顺序与函数注册的顺序相反。当进程收到致命信号而退出时,注册的清理函数不会被执行;当进程调用_exit退出时,注册的清理函数不会被执行;当执行到某个清理函数时,若收到致命信号或清理函数调用了_exit()函数,那么该清理函数不会返回,从而导致排在后面的需要执行的清理函数都会被丢弃

  2. 其次是exit函数会冲刷(flush)标准I/O库的缓冲并关闭流。
    glibc提供的很多与I/O相关的函数都提供了缓冲区,用于缓存大块数据。缓冲有三种方式:无缓冲(_IONBF)、行缓冲(_IOLBF)和全缓冲(_IOFBF)。

  • 无缓冲:就是没有缓冲区,每次调用stdio库函数都会立刻调用read/write系统调用。
  • 行缓冲:对于输出流,收到换行符之前,一律缓冲数据,除非缓冲区满了。对于输入流,每次读取一行数据。
  • 全缓冲:就是缓冲区满之前,不会调用read/write系统调用来进行读写操作。

对于后两种缓冲,可能会出现这种情况:进程退出时,缓冲区里面可能还有未冲刷的数据。如果不冲刷缓冲区,缓冲区的数据就会丢失。比如行缓冲迟迟没有等到换行符,又或者全缓冲没有等到缓冲区满。尤其是后者,很容易出现,因为glibc的缓冲区默认是8192字节。exit函数在关闭流之前,会冲刷缓冲区的数据,确保缓冲区里的数据不会丢失。

  1. 存在临时文件,exit函数会负责将临时文件删除。
  2. 调用_exit()函数。

清理函数

可以使用atexit()函数或on_exit()函数来注册清理函数,以在程序终止时执行一些特定的清理操作。

atexit()函数:

  • 原型:int atexit(void (*function)(void))
  • 作用:用于注册一个清理函数,该函数在程序正常终止时被调用。
  • 参数:function是一个指向无返回值的函数的指针,该函数没有参数。
  • 返回值:成功注册清理函数时返回0,失败时返回非零值。

以下是使用atexit()函数注册清理函数的示例:

#include <stdio.h>
#include <stdlib.h>

void cleanup1()
{
    printf("Cleaning up...1\n");
}

void cleanup2()
{
    printf("Cleaning up...2\n");
}

int main()
{
    printf("Main program starts.\n");

    // 注册清理函数
    atexit(cleanup1);
    atexit(cleanup2);

    printf("Main program ends.\n");

    exit(0);
}

运行结果:
在这里插入图片描述

在上述示例中,cleanup()函数被注册为清理函数。当程序正常终止时,清理函数会被自动调用。

on_exit()函数:

  • 原型:int on_exit(void (*function)(int status, void *arg), void *arg)
  • 作用:用于注册一个清理函数,该函数在程序终止时被调用,不论是正常终止还是异常终止
  • 参数:
    • function是一个指向接受两个参数的函数指针,第一个参数是终止状态码,第二个参数是可选的自定义参数。
    • arg是一个可选的自定义参数,会传递给清理函数。
  • 返回值:成功注册清理函数时返回0,失败时返回非零值。

以下是使用on_exit()函数注册清理函数的示例:

#include <stdio.h>
#include <stdlib.h>

void cleanup1() {
  printf("Cleanup 1 called\n");
}

void cleanup2(int status, void *arg) {
  printf("Cleanup 2 called with status: %d, arg: %p\n", status, arg);
}

int main() {
  // 使用 on_exit 函数注册终止处理函数
  on_exit(cleanup1, NULL);
  on_exit(cleanup2, (void *)0x12345678);

  printf("Main function executing\n");
  // 这里可以添加一些其他逻辑

  // return是一种更常见的终止进程的方法。
  // 执行return(n)等同于执行exit(n),因为调用main()的运行时函数会将main的返回值当作exit的参数。
  return 0;
}

运行结果:
在这里插入图片描述

在上述示例中,cleanup()函数被注册为清理函数,并且不接受自定义参数。当程序终止时,清理函数会被自动调用,并传递终止状态码作为参数。

推荐使用atexit,因为atexit是c标准函数,不同系统都会支持。而on_exit可能会在某些平台下无法支持,此函数来自 SunOS 4,但也存在于 libc4、libc5 和 glibc 中。它不再出现在 Solaris (SunOS 5) 中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/505233.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode刷题---链表

目录 1.删除链表的倒数第N个节点两两交换链表中的节点反转链表2 1.删除链表的倒数第N个节点 根据题目描述&#xff0c;第一个思路是存到数组中对数组进行操作&#xff0c;想到数组我们就可以想到下标和倒数第N个的关系&#xff0c;所以我们可以不额外开空间&#xff0c;可以直接…

vuex插件实现数据共享

vuex插件 vuex是管理多个vue通用的数据的插件.(状态管理工具,状态是数据) 我们对于多个vue文件之间的共同数据,是用props传递,或者对于一个vue实例对象,进行绑定,传参,也是多次传参,多个文件之间,比较麻烦. 但是我们vuex会创建一个公共对象,从这个公共对象上赋值,比较简单易…

appium辅助自动化工具-- Appium studio

这里我要给大家介绍一款appium辅助自动化测试工具appium studio&#xff0c;你没看错&#xff0c;不是android studio&#xff0c;也不是appium android studio&#xff0c;就是appium studio&#xff01; 下载地址&#xff1a; Appium Studio | Digital.ai Continuous Test…

【应用笔记】LAT1413+快速开关蓝牙导致设备无广播

1. 问题背景 客户使用 BlueNRG-345MC 开发了一个 BLE 外设&#xff0c;和手机连接。在测试中发现&#xff0c;手机连接上外设之后&#xff0c;不断地在手机上点击蓝牙的开关按钮&#xff0c;造成设备不断地断开、重连&#xff1b;少则几次&#xff0c;多则几十次。点击之后&am…

【小贪】万字长文介绍因果推断和增益模型

文章目录 因果推断和增益模型1. 绪论2. 因果推断基础3. 主要增益模型3.1 Meta Learning3.1.1 S-Learner&#xff08;One Model&#xff09;3.1.2 T-Learner&#xff08;Two Model&#xff09;3.1.3 R-Learner3.1.4 X-Learner3.1.5 类别转换法&#xff08;Class Transformation …

2024年noc指导教师认证测评参考试题题目5-6合集

[noc指导教师认证] 测评参考试题 说明:NOC教师指导认证考试题目是从题库里抽题,因此每位老师每次考试题目都不一样以下题目为测试考试时收集到的一些题目,作为辅助提供给各位老师,老师们可以记住题目及答案的具体内容 (选项顺序会变),以免考试时遇到。2024年的做的题目有的…

.Websalm勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复

导言&#xff1a; 在数字化时代&#xff0c;网络安全问题日益凸显&#xff0c;其中勒索病毒作为一种新型的电脑病毒&#xff0c;以其独特的传播方式和恶劣的性质&#xff0c;给广大用户带来了巨大的困扰。近期&#xff0c;Websalm勒索病毒成为了公众关注的焦点&#xff0c;其强…

【图轮】【 最小生成树】【 并集查找】1489. 找到最小生成树里的关键边和伪关键边

本文涉及知识点 图轮 最小生成树 并集查找 关键边 1489. 找到最小生成树里的关键边和伪关键边 给你一个 n 个点的带权无向连通图&#xff0c;节点编号为 0 到 n-1 &#xff0c;同时还有一个数组 edges &#xff0c;其中 edges[i] [fromi, toi, weighti] 表示在 fromi 和 to…

【C++庖丁解牛】自平衡二叉搜索树--AVL树

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 前言1 AVL树的概念2. AVL…

【A-006】基于SSH的新闻发布系统(含论文)

【A-006】基于SSH的新闻发布系统&#xff08;含论文&#xff09; 开发环境&#xff1a; Jdk7(8)Tomcat7(8)MySQLIntelliJ IDEA(Eclipse) 数据库&#xff1a; MySQL 技术&#xff1a; SpringStruts2HiberanteJSPJquery 适用于&#xff1a; 课程设计&#xff0c;毕业设计&…

玩转Django分页器

一、Pagination 分页器编程步骤 View, 导入django.core.paginator.Paginator类&#xff0c;创建Paginator 对象时&#xff0c;输入qs对象&#xff0c;以及每页显示条数。 接收 URL, 从请求参数中读取page数值 &#xff0c;通过 paginator.page(page_num) 返回请求页的page_obj…

ObjectiveC-05-复杂和特殊数据类型

这一节中会详细介绍下ObjectiveC中的复杂数据类型&#xff0c;这些类型不太是太归类。但非常有用&#xff0c;有的用于定义变量、有的则是专门用于方法的返回值。 常用的大概有如下这些&#xff1a; 以上这些特殊的数据类型都可用于变量、方法返回值、方法参数使用&#xff0c…

目标伪类选择器

E:target选择匹配E的所哟元素&#xff0c;且匹配元素被相关url指向 鼠标点击右边京东秒杀跳转到京东秒杀div&#xff0c;并变成黄色 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport&…

HTML块级元素和内联元素(头部和布局)

目录 1.HTML块级和内联标签&#xff1a; 1.块级元素&#xff1a; 2.内联元素: 3.元素嵌套&#xff1a; 4.元素转换&#xff1a; 示例如下: 2.内联框架&#xff1a; 前言&#xff1a; 示例如下: 3.布局&#xff1a; 4.头部标签&#xff1a; 前言&#xff1a; 说明&…

Java获取当前时间

获取当前的时间 在Java中获取时间和日期使用Date类中的 toString方法 import java.util.Date;public class DateDemo {public static void main(String[] args) {Date date1new Date();System.out.println(date1.toString());} } 进一步格式化时间 SimpleDateFormat 是格式化…

Netty组件优化之FastThreadLocal

ThreadLocal:CSDNhttps://mp.csdn.net/mp_blog/creation/editor/132995427 Netty中的FastThreadLocal是对Java中的FastThreadLocal的优化主要是为了解决ThreadLocal中线性查找 带来的性能下降同时实现快速查找和赋值 FastThreadLocal构建这里的index代表一个编号&#xff0c;从…

ROS机器人入门第五课:话题通信自定义msg

文章目录 ROS机器人入门第五课&#xff1a;话题通信自定义msg一、介绍二、流程&#xff08;一&#xff09;定义msg文件&#xff08;二&#xff09;编辑配置文件&#xff08;三&#xff09;编译 三、话题通信自定义msg调用&#xff08;一&#xff09;调用流程0.vscode配置1.发布…

论文笔记 - :MonoLSS: Learnable Sample Selection For Monocular 3D Detection

论文笔记✍MonoLSS: Learnable Sample Selection For Monocular 3D Detection &#x1f4dc; Abstract &#x1f528; 主流做法限制 &#xff1a; 以前的工作以启发式的方式使用特征来学习 3D 属性&#xff0c;没有考虑到不适当的特征可能会产生不利影响。 &#x1f528; 本…

基于java+SpringBoot+Vue的网上书城管理系统设计与实现

基于javaSpringBootVue的网上书城管理系统设计与实现 开发语言: Java 数据库: MySQL技术: SpringBoot MyBatis工具: IDEA/Eclipse、Navicat、Maven 系统展示 前台展示 后台展示 系统简介 整体功能包含&#xff1a; 网上书城管理系统是一个基于互联网的在线购书平台&#…

基于springboot实现旅游网站系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现旅游网站系统演示 摘要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff0c;旅游网站当然也不能排除在外&#xff0c;随着旅游网站的不断成熟&#xff0c;它彻底改变了过去传统的旅游…