搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
天景科技苑
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
Python中的三目运算符_python for 三目运算符
2
嵌入式最强调试终端神器—MobaXterm_终端调试软件
3
C语言程序设计实训手册,C语言程序设计实训指导书.doc
4
SQL Server 2014数据库远程访问设置方法_sql2014远程访问设置
5
如何在Java中快速掌握最新技术
6
拒了阿里offer,HR表示诧异,网友:这是你职业生涯的巅峰了_因为是富二代 被拒offer
7
Python中绘制折线图的全面指南_python绘制折线图
8
TF-IDF算法(纯代码)_tf-idf代码
9
NFV基本概述_nfv是通过什么虚拟化
10
TPC-H生成数据集并导入数据库
当前位置:
article
> 正文
C语言退出函数
作者:天景科技苑 | 2024-08-05 20:38:20
赞
踩
c语言退出函数
C标准定义了下面的退出函数:
#include <stdlib.h>
void exit(int status);
void _Exit(int status);
int atexit(void (*function)(void));
函数功能介绍如下:
void exit(int status)
该函数终止调用的程序。status传递给系统用于父进程恢复。程序退出之前,exit()调用所有以atexit()注册的函数,清空所有打开的<stdio.h> FILE*流的缓冲区并关闭流,然后删除所有由tmpfile()创建的临时文件。进程退出时,内核关闭所有剩下的已打开文件(即那些由open()、creat()或文件描述符继承打开的文件),释放其地址空间,然后释放所有其他使用的资源。exit()从不返回。
void _Exit(int status)
该函数基本上与POSIX的_exit()函数相同;我们稍后再对其进行介绍。
int atexit(void (*function)(void))
function是一个函数指针,指向程序退出时候调用的一个回调函数。exit()在其关闭文件和终止之前调用该回调函数。这个想法在于程序能够在最终关闭之前提供一个或者多个运行的清理函数。提供一个函数被成为注册该函数。
atexit()成功时返回0,出错时返回-1并设置相应的errno。
下面的程序没有有用的功能,但它演示了如何使用atexit():
void callback1(void){printf("callback called\n");}
void callback2(void)(printf("callback called\n");}
void callback3(void)(printf("callback called\n");}
int main(int argc,char** argv)
{
printf("registering callback1\n");atexit(callback1);
printf("registering callback2\n");atexit(callback2);
printf("registering callback3\n");atexit(callback3);
printf("exiting now\n");
exit(0);
}
下面是程序的运行结果:
$atexit
registering callback1
registering callback2
registering callback3
exiting now
callback3 called
callback2 called
callback1 called
正如上例所示,使用atexit()注册的函数运行时的顺序和注册的顺序相反:最近注册的最先运行(这也称为后进先出(last-in-first-out),缩写为LIFO)。
POSIX定义了_exit()函数。与exit()不同,exit()调用回调函数并进行<stdio.h>清理,_exit()是“立即死亡”的函数:
#include <unistd.h>
void _exit(int status);
_exit终止调用进程,但不关闭文件,不清除输出缓存,也不调用出口函数。exit函数将终止调用进程。在退出程序之前,所有文件关闭,缓冲输出内容将刷新定义,并调用所有已刷新的“出口函数”(由atexit定义)。
实际上,ISO C的_Exit()函数与_exit()相同。C函数指出_Exit()是否调用以atexit()注册的函数并关闭打开的文件取决与实现。对于GLIBC系统,可能不会,即_Exit()与_exit()表现相似。
使用_exit()的时机是在fork()产生的子进程中调用exec()失败的时候。这种情况下,不需要使用通常的exit(),因为它会清空所有由FILE*流保存的缓冲区数据。随后父进程清空其缓冲区拷贝时,导致缓冲的数据被写了两次;显然这不是很恰当。
例如,加入你运行了一个shell命令,并且自己调用fork()和exec()。代码可能如下所示:
char *shellcommand="...";
pid_t child;
if((child=fork())==0){
execl("/bin/sh","sh","-c",shellcommand,NULL);
_exit(errno==ENOENT?127:126);
}
errno测试和退出值采取了POSIX shell所使用的惯例。如果要求的程序没有退出(ENOENT——目录中没有它的项),则退出值为127。否则,文件同样退出,但由于其他原因不能够被exec()执行,则退出状态为126。在你自己的程序中采取这个惯例将会是个好主意。
简言之,为了更好地使用exit()和atexit(),你应该遵循一下规则:
1、定义一个较小的退出状态值的集合,你的程序使用该集合中的值与其调用者进行通信。在你的代码中使用#define常量或enum定义这些值。
2、决定是否有必要与atexit()一起使用回调函数。如果有必要,则在main()中适当地方注册这些函数;例如,在解析选项之后以及初始化任何回调函数可能清除的数据结构之后,记住函数以LIFO(last-in-first-out)顺序进行调用。
3、如果出错,在任一地方都可以使用exit()从程序退出,退出是能够发生的正确行为。同时使用你定义的错误代码。
4、main()函数是个例外,你可以在其中使用return。我们自己的风格是,通常出问题时使用exit(),而如果一切正常,在main()结尾处使用“return 0”。
5、如果调用exec()失败,则在子进程中使用_exit()或_Exit()。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/天景科技苑/article/detail/934161
推荐阅读
article
android
注册
广播
地址,
android
之
注册
registerReceiver
...
image.pngBroadcastReceiver
广播
作为四大组件之一,使用方式也是多种多样的,既可以自己在manif...
赞
踩
article
C#
修改
内存
外挂源码...
完整源码:// Program.csusing System;using System.Threading;/*** 作...
赞
踩
article
pandas
的
Excel
文件
读写(一)——组件要求与
文件
读取
_
pandas
读取
xls
文件
吗...
一、组件要求实现
pandas
的
Excel
文件
读写,除了安装
pandas
外,还需要安装下列组件:(1)xlrd:从指定的x...
赞
踩
article
基础
算法
+
动态
规划
+
贪心
每日一题...
基于对C++语法的学习,我觉得
算法
对现在来说也是非常重要的,以此写下博客来记录每日的
算法
学习,从基础的开始,有更优秀的解...
赞
踩
article
只用一部
手
机
,为你的
吉利
车
机
安装第三方软件(支持
大部分
车型
)_
吉利
dns
查询...
支持的
车型
涵盖了多款
吉利
品牌
车型
,包括21款博瑞、18及19款博瑞GE、18及20款博越、博越PRO、星越全系列、星瑞全...
赞
踩
article
二叉树
遍历
顺序...
二叉树
的
遍历
方式有三种:先序
遍历
、中序
遍历
和后序
遍历
等。_
二叉树
遍历
顺序
二叉树
遍历
顺序 ...
赞
踩
article
测试
三年
,
想
转行
能
做些啥?
_
软件
测试
转行
...
测试
三年
,
想
转行
能
做些啥?
_
软件
测试
转行
软件
测试
转行
在...
赞
踩
article
贪心
算法
(
greedy
algorithm
,又称贪婪
算法
)
详解
(
附例题
)
...
哈夫曼编码的解决方案是这样的:不断找到当前出现频率最小的两个结点
(
字符或频率
)
,将它们结合,作为一个新生成的结点的左右子...
赞
踩
article
数据
仓库
、
数据
湖
、
数据
中台
_
数据
仓库
定位...
数据
仓库
、
数据
湖
、
数据
中台
前言一:
数据
仓库
1.1
数据
仓库
基本定义1.2
数据
仓库
系统作用和定位1.3
数据
仓库
能提供什...
赞
踩
article
java
集成
ELK
(日志工具)
的
知识点
总结
_
java
继承
elk
...
分享大事
的
连接:https://blog.csdn.net/sugesi/article/details/8003115...
赞
踩
article
低
代码
与
软件
定制
开发
:打造
灵活
高效的销售
管理系统
...
低
代码
和
软件
定制
开发
的结合,既保留了快速构建和
灵活
定制
的优势,又弥补了各自的不足,为企业在竞争激烈的市场中提供了强有力的...
赞
踩
article
11
--
ElasticStack7
-ELK+
Kafka
_
elk
kafka
...
极度详细的
elk
+efk+
kafka
使用详解,内部配置参数在工作环境中可以直接复制对应配置写入,概念点同时非常重要希望时...
赞
踩
article
微信
小
程序
码
生成
,扫码携带
参数
进入指定页面_
微信
小
程序
生成
二维码带
参数
分销...
微信
小
程序
码
生成
,扫码携带
参数
进入指定页面_
微信
小
程序
生成
二维码带
参数
分销
微信
小
程序
生成
二维码带
参数
分销 ...
赞
踩
article
【.
NET
资源
收集】
C#
与时俱进
的
知识点..._
c#
函数式编程 编写更优质
的
c#
代码pdf下载...
前言:本文仅仅作为一个个人草稿本,收藏一些网站,一些
资源
分享,一些书记分享,对于.
NET
的
学习非常有帮助,免得到时候再找...
赞
踩
article
SpringCloud
之
Gateway
使用篇_
spring
-
cloud
-
gateway
-
server
...
SpringCloud
之Feign使用篇_
spring
-
cloud
-
gateway
-
server
spring
-
cloud
...
赞
踩
article
SQL
Server
(MS
SQL
SERVER)无法
启动
问题解决_
analysis
service
启动
...
1.打开
SQL
配置管理器;2.找到
SQL
Server
网络配置选项下的MS
SQL
SERVER的协议;3.右边启用Shar...
赞
踩
article
Flutter
日记--
修改
App
图标
,
名称
,
启动
页_
flutter
修改
启动
页...
本人从事Android开发已经有十余年
,
算是一名资深的移动开发架构师了吧。根据我的观察发现
,
对于很多初中级Android...
赞
踩
article
大数据
Flink
SQL
CDC
实时
数据整库同步
实时
宽表
实时
计算 流批一体_
flink
cd...
应用案例基于 Apache
Flink
和规则引擎的
实时
风控解决方案 日均百亿级日志处理:微博基于
Flink
的
实时
计算...
赞
踩
article
系统
架构师
——统一
建模语言
(
UML
)_
uml
架构师
...
在
UML
中,包括 3 种不同形式的交互图,强调对象交互行为顺序的顺序图,强调对象协作的通信图(协作图),强调消息的具...
赞
踩
article
笔记
:
PyTorch
文档阅读
(
1
)
自动求导机制...
如果你需要实现自定义的梯度计算或者使用梯度裁剪等技术,梯度跟踪是必要的。
笔记
:
PyTorch
文档阅读
(
1
)
自动求导机制 ...
赞
踩
相关标签
android注册广播地址
c#
java
runtime
python
big data
算法
动态规划
智能手机
数据结构
web安全
安全
linux
windows
网络安全
测试工具
ab测试
贪心算法
低代码
elk
运维
笔记
kafka
分布式