linux的exit和_exit

2023-05-16

进程退出

退出一个进程有多种方式:

正常退出:

  • 在main函数里return

  • 在进程里面调用exit、_exit

  • 在进程的最后一个子线程调用pthread_exit

异常退出:

  • 被信号(9、15)终止

下面讲一下exit和_exit这两个函数的特点和区别

exit、_exit

这两个函数都可以用来退出进程,释放当前进程的系统资源,并返回进程退出时的状态。

函数原型如下:

#include <unistd.h>
void _exit(int status);
#include <stdlib.h>
void exit(int status);

返回值:它们都不会返回
形参:它们都可以指定退出时的状态,放到status里

差异

exit和_exit的差异可以概括成下面这张图:
1234

在讲述差异之前需要先引入一个函数:atexit。
atexit是一个注册退出处理函数,他有什么用呢?
我们在退出一个进程之前,需要做一些善后工作,比如关闭信号量、取消共享内存的映射、关闭已打开的管道文件等等;atexit就可以帮我们做(处理)这个事情。

从上图可以看出,exit函数在调用exit系统调用退出进程之前会调用退出处理函数,但_exit函数并不会调用,直接退出;这就是第一个差异。

这里需要注意使用atexit注册退出处理函数是按照栈的结构注册的,先进后出。(下面示例会展示效果)

第二个差异就是exit会清理IO缓存,如果缓冲区有数据,他会把数据刷新回设备;而_exit函数不会这么做,缓存数据会直接丢失。

代码示例

下面举例说明exit和_exit的作用。

exit示例如下:

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

void fun1(void)
{
	printf("[%s] is calling...\n", __FUNCTION__);
}

void fun2(void)
{
	printf("[%s] is calling...\n", __FUNCTION__);
}


int main(void)
{
	atexit(fun1);
	atexit(fun2);

	printf("hello, kugou");
	exit(0);
}

运行结果如下:

zzc@zzc-virtual-machine:~/share/example$ ./exit 
hello, kugou[fun2] is calling...
[fun1] is calling...

上述结果分析:

  1. 这个程序注册了两个退出处理函数fun1、fun2,由于先进后出,所以退出进程时先调用fun2,再调fun1
  2. 上面的printf函数用来打印一个字符串,并且是全缓冲;你会发现退出进程时,IO缓冲区的数据会被刷新到标准输出设备(显示器)

_exit示例如下:

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

void fun1(void)
{
	printf("[%s] is calling...\n", __FUNCTION__);
}

void fun2(void)
{
	printf("[%s] is calling...\n", __FUNCTION__);
}


int main(void)
{
	atexit(fun1);
	atexit(fun2);

	printf("hello, kugou");
	_exit(0);
}

运行结果如下:

zzc@zzc-virtual-machine:~/share/example$ ./exit 
zzc@zzc-virtual-machine:~/share/example$ 

结果分析:
退出进程时并没有调用退出处理函数,也不会清理IO缓冲区的数据。

总结

本文简单介绍了exit和_exit的特点和差异,并举例展示了他们的效果。
好记性不如烂笔头。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux的exit和_exit 的相关文章

随机推荐

  • 《Python程序设计与算法基础教程(第二版)》江红 余青松 课后选择题 课后填空题答案

    目录 第一章一 选择题二 填空题 第二章一 选择题二 填空题 第三章一 选择题二 填空题 第四章一 选择题二 填空题 第五章一 选择题二 填空题 第八章一 选择题二 填空题 第一章 一 选择题 Python语言属于 C A 机器语言 B 汇
  • TensorFlow学习(二):变量常量类型

    更新时间 xff1a 2017 2 27 tensorflow 1 0出来了 xff0c API和以前有了一些不一样 xff0c 所以这里把把之前的代码迁移到新的上面去 更新时间 xff1a 2017 5 4 对于一些性质有了新的认识 补充
  • CAN总线的数据校验

    题目来源 有很多网友在QQ上问关于CAN总线上数据需不需要加校验 xff0c 换句话说 xff0c CAN总线支不支持校验 xff0c 我们需要在我们的数据场 xff08 数据域 xff09 加上校验码吗 xff1f 答案是否定的 CAN总
  • TensorFlow中报错 module ‘tensorflow_core._api.v2.train‘ has no attribute ‘GradientDescentOptimize

    原来函数是这样写的 xff1a optimizer 61 tf train GradientDescentOptimizer 报错 xff1a AttributeError module 39 tensorflow core api v2
  • 有趣的黑客网站 | 伪装成黑客高手,像电影黑客一样打字如飞

    当黑客 xff0c 门槛太高 xff1b 装黑客 xff0c 那就太容易了 今天刷知乎的时候无意中看到一个非常神奇的网站 xff0c 能让你瞬间变身成电影中的黑客 xff0c 操作出一系列看起来非常牛逼且装逼的功能 你只管噼里啪啦打字 xf
  • win10共享打印机(连接共享打印机的两种方法,IP地址变化的连接方法)

    一 首先电脑连接打印机 xff0c 把所连接的打印机设置为共享 xff0c 如下图所示 xff1a 先打开电脑设置 xff0c 然后点击设备 打印机和扫描仪 xff0c 打开如下界面 点击管理 打印机属性 xff0c 会出现如下界面 点击共
  • (Python)Pandas reset_index()用法总结

    Pandas是一个数据处理的库 xff0c 今天我们来学习reset index 这个函数的用法 pandas DataFrame reset index 函数作用 xff1a 重置索引或其level 重置数据帧的索引 xff0c 并使用默
  • 用Python批量修改图片名称(后缀)

    当我们需要修改批量即几百幅图片的名称或后缀时 xff0c 如果一个一个图片名称去重命名或是修改的话工作量就会很大 作为一名程序员 xff0c 当然是要通过代码去解决这些繁琐的事情 下面是用python代码来实现批量修改图片名称的代码 xff
  • git基本操作介绍

    简介 本文会简单介绍git的基本操作 这篇文章适合对git的安装 使用 运行环境 工作原理有一定了解的人员阅读 xff1b 对于初学者 xff0c 可以先参考以下文章 xff1a 最新git安装教程 windows系统git安装教程 git
  • Anaconda创建跟别人环境配置一样的虚拟环境(coda env creat -f environment.yml)

    当我们跑别人在github上的代码时 xff0c 往往需要配置跟作者一样的环境 当作者导出自己的环境配置时 xff0c 一般都是 yml文件 xff0c 这时候需要输入命令行来实现配置一模一样的环境 导出的yml文件一般配置如下 xff1a
  • 计算机视觉代码学习

    前言 自从2012年Hinton提出Alexnet以来 xff0c 深度学习 计算机视觉 xff08 CV xff09 就成为一个非常热门的赛道 从学术界到工业界 xff0c 纷纷掀起一股人工智能的浪潮 特别是学术界 xff0c 计算机视觉
  • 如何准备大学生电子设计竞赛

    大学生电子设计竞赛难度中上 xff0c 一般有好几个类型题目可以选择 xff0c 参赛者可以根据自己团队的能力 优势去选择合适自己的题目 xff0c 灵活自主空间较大 参赛的同学们可以在暑假好好学习相关内容 xff0c 把往年的题目拿来练练
  • 聊聊ChatGPT

    ChatGPT 这几周科技圈最火的当属ChatGPT xff0c 自媒体中十篇有九篇都是关于ChatGPT的 ChatGPT上可知天文 xff0c 下可知地理 xff0c 还可写论文 搞代 写小说 xff0c 可谓 全能型选手 自从去年11
  • 修改简历有用吗

    看情况 xff0c 一般都是很有用哒 xff01 简历修改会突出你的重点和优点 xff0c 优化你的简历内容 xff0c 让面试官一眼看到简历就被吸引了 xff01 如以上图片所示
  • 运行Python时出现SyntaxError: EOL while scanning string literal解决方法

    当运行Python时 xff0c 出行SyntaxError EOL while scanning string literal 一般是语法出现错误 xff0c 看一下是不是哪里忘记添加符号或是分号 xff1a 这些没打
  • 数据结构选择练习题(有解析)

    前言 已经到期末了 xff0c 昨天进行了一次马原考试 xff0c 那时候挺紧张的 xff0c 那时候虽然写完了试卷 xff0c 但是有4道题是乱写的 xff0c 因为我刚好没有背 xff0c 希望不会挂科吧 然后今天呢 xff0c 就开始
  • 论文阅读_异常检测综述

    英文题目 xff1a Anomaly Detection A Survey 中文题目 xff1a 异常检测综述 论文地址 xff1a https readpaper com paper 2122646361 领域 xff1a 异常检测 发表
  • 解决Mybatis-Plus分页插件无效

    1 导入依赖 span class token tag span class token tag span class token punctuation lt span dependencies span span class token
  • 一、FreeRTOS任务调度相关函数详解

    文章目录 1 FreeRTOS任务调度及相关函数分析1 1 任务创建过程分析1 1 1 任务创建函数分析1 1 2 任务初始化函数分析1 1 3 任务堆栈初始化分析1 1 4 添加任务到就绪列表 1 2 任务删除过程分析1 3 任务挂起过程
  • linux的exit和_exit

    进程退出 退出一个进程有多种方式 xff1a 正常退出 xff1a 在main函数里return 在进程里面调用exit exit 在进程的最后一个子线程调用pthread exit 异常退出 xff1a 被信号 xff08 9 15 xf