《Linux系统调用: exit,_exit,atexit,on_exit》

这篇博客详细介绍了Linux系统中四种不同的退出方式:exit, _exit, atexit和on_exit。atexit用于注册程序终止时执行的函数,最多可注册32个,调用顺序与注册顺序相反。on_exit与atexit类似,但能传递参数。Exit和exit是等价的,无返回值,status参数传递给父进程。而_Exit是标准库函数,exit是系统调用。文章还对比了return和exit的区别,并通过实例展示了status的使用。" 113490467,10548027,Excel实用技巧:打造个人小软件,"['Excel', '办公软件', '数据处理', '打印设置', '工作簿管理']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、介绍

下列函数都是 “立即”终止调用过程

atexit()函数用来注册程序正常终止时要被调用的函数,一个程序中最多可以用atexit()注册32个处理函数,这些处理函数的调用顺序与其注册的顺序相反,也即最先注册的最后调用,最后注册的最先调用

on_exit 和 atexit 一样,可以传入参数 和 atexit 共顺序

Exit 和 exit和 exit 一样 ,没有返回值,传入的status是返回给父进程的参数(低 8 位有效)

_Exit 和 exit()属于标准库函数,exit()属于系统调用函数

二、接口函数

#include <stdlib.h>
void exit(int status);
int atexit(void (*function)(void));
//正确返回0,失败返回非零的errno值
int on_exit(void (*
这段代码 `using ::at_quick_exit;` 是 C++ 中用于引入全局命名空间 (`::`) 中的符号 `at_quick_exit` 到当前作用域中的声明。接下来我将详细介绍这个函数的作用和用法。 ### `at_quick_exit` 函数介绍 - **功能**: - `std::at_quick_exit` 是一个标准库函数,允许用户注册一个或多个清理回调函数 (cleanup functions),这些函数会在程序调用 `std::quick_exit()` 时执行。 - **头文件**: - 此函数定义在 `<cstdlib>` 头文件中。 - **原型**: ```cpp std::add_function<void ()> at_quick_exit(std::function<void()> f); ``` - **行为说明**: - 当你调用了 `std::quick_exit()`, 所有的已注册给 `std::at_quick_exit` 的函数都会按照它们被加入顺序相反的方式依次被执行一次。也就是说最后一个添加进去的会最先运行。 - 注册的过程不会立即执行传递进来的函数对象;只有当真正发生快速退出(`quick_exit`)的时候才会触发那些已经登记过的任务。 - 如果有任何一个这样的处理器抛出了异常,则整个进程终止(`std::terminate`)。因此我们应该保证每个处理器都能够正常完成而不产生新的未捕获异常。 - **对比与差异** - 它类似于传统的 `std::atexit()` 功能但是有一个关键的不同点在于它是用来配合 `std::quick_exit` 使用而不是普通的 `_Exit`(POSIX)/`_exit`(Windows)系统调用或是正常的程序结束流程。 - 相较于普通关闭路径而言, 快速退出不会调用静态对象销毁子句,也不会做任何常规资源回收动作(如 flush I/O 缓冲区等),所以更适合需要紧急停止的情况。 ### 示例用途场景 这里提供一个小例子来演示其基本用法: ```cpp #include <iostream> #include <cstdlib> void cleanup_handler1(){ std::cout << "Cleanup handler 1 called.\n"; } int main(){ // Registering handlers for quick exit scenario. using ::at_quick_exit; at_quick_exit(cleanup_handler1); try{ throw std::runtime_error("Something went wrong!"); } catch(const std::exception& e){ std::cerr << "Error caught: " << e.what() << "\nPerforming a quick exit now...\n"; std::quick_exit(0); // This triggers the registered function(s). } return 0; } ``` 在这个简单的例子当中,我们首先使用了 `using ::at_quick_exit;` 来把来自全局命名空间内的 `at_quick_exit` 引进来以便后续可以直接引用而无需前缀限定符。接着我们在遇到错误之后选择不经过常规终止步骤而是直接采取快速退出机制,这时先前所绑定的那个清理处理就会得到调用输出对应的消息。 希望以上解释能够帮助您理解 `using ::at_quick_exit;` 这一行的意义及其背后涉及的概念!如果您还有疑问或其他方面想要深入了解的地方,请随时告诉我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HarkerYX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值