atexit&on_exit

本文探讨了atexit和on_exit函数的应用与区别,重点介绍了这两个函数在Linux环境下的使用方式及其背后的原理。通过深入解析,帮助读者更好地理解如何利用它们进行程序资源的清理工作。
在上一关我们学习使用vfork数创建新进程,并且使用exit结束子进程,本关我们将介绍Linux系统中结束进程的其它方法。 本关任务:学习终止进程的常见方法。 相关知识 在上一关以及看到,开发人员使用vfork创建出来的子进程可以用exit数来结束。在 Linux 环境中,一个进程的结束,可以通过调用相应的数实现,也可以是接收到某个信号而结束。 常见与退出进程相关的数有:exit、_exitatexiton_exit、abort和assert。 exit数是标准C库中提供的数,它用来终止正在运行的程序,并且关闭所有I/O标准流。 _exit数也可用于结束一个进程,与exit数不同的是,_exit不会关闭所有I/O标准流。 atexit 数用于注册一个不带参数也没有返回值的数以供程序正常退出时被调用。 on_exit 数的作用与atxeit数十分类似,不同的是它注册的数具有参数,退出状态和参数arg都是传递给该程序使用的。 abort 数其实是用来发送一个SIGABRT信号,这个信号将使当进程终止。 assert是一个宏。调用assert时,它将先计算参数表达式 expression的值,如果为0,则调用abort结束进程。 [exit和_exit区别] 以上关于退出处理数中只有_exit是系统调用数,因此使用man 2 _exit来查看其使用方法,而其余数都是库数,因此使用man 3 数名来查看其使用方法。 exit和_exit使用方法 exit数的具体的说明如下: 需要的头文件如下: #include <stdlib.h> 数族格式如下: void exit(int status); 参数说明: status:设置程序退出码; _exit数的具体的说明如下: 需要的头文件如下: #include <unistd.h> 数族格式如下: void _exit(int status); 参数说明: status:设置程序退出码; 数返回值说明: exit和_exit均无返回值。 atexiton_exit使用方法 atexiton_exit数的具体的说明如下: 需要的头文件如下: #include <stdlib.h> 数族格式如下: int atexit(void (*function)(void)); int on_exit(void (*function)(int , void *), void *arg); 参数说明: atexit数的function参数是一个数指针,指向无返回值和无参数的数; on_exit数的function参数是一个数指针,指向无返回值和有两个参数的数,其中第一个参数是调用exit()或从main中返回时的值,参数arg指针会传给参数function数; 数返回值说明: atexiton_exit调用成功返回0;调用失败返回一个非零值。 注意:atexiton_exit只有在程序使用exit或者main中正常退出时才会有效。如果程序使用_exit、abort或assert退出程序时,则不会执行被注册的数。 案例演示1: 使用atexit注册一个退出数,使其在调用退出被执行,详细代码如下所示: #include <stdlib.h> #include <stdio.h> void out() { printf("程序正在被退出\n"); } int main() { if(atexit(out) != 0) { printf("调用atexit数错误\n"); } return 0; //或者exit(0) } 将以上代码保存为atexit.c文件,编译执行。可以看到执行atexit程序后,out数被调用。 案例演示2: 使用on_exit注册一个退出数,使其在调用退出被执行,详细代码如下所示: #include <stdlib.h> #include <stdio.h> void out(int status, void *arg) { printf("%s(%d)\n", (char *s)arg, status); } int main() { if(on_exit(out, "程序正在被退出") != 0) { printf("调用on_exit数错误\n"); } exit(1); //或者return 1 } 将以上代码保存为on_exit.c文件,编译执行。可以看到执行on_exit程序后,
10-25
任务描述 在上一关我们学习使用vfork数创建新进程,并且使用exit结束子进程,本关我们将介绍Linux系统中结束进程的其它方法。 本关任务:学习终止进程的常见方法。 相关知识 在上一关以及看到,开发人员使用vfork创建出来的子进程可以用exit数来结束。在 Linux 环境中,一个进程的结束,可以通过调用相应的数实现,也可以是接收到某个信号而结束。 常见与退出进程相关的数有:exit、_exitatexiton_exit、abort和assert。 exit数是标准C库中提供的数,它用来终止正在运行的程序,并且关闭所有I/O标准流。 _exit数也可用于结束一个进程,与exit数不同的是,_exit不会关闭所有I/O标准流。 atexit 数用于注册一个不带参数也没有返回值的数以供程序正常退出时被调用。 on_exit 数的作用与atxeit数十分类似,不同的是它注册的数具有参数,退出状态和参数arg都是传递给该程序使用的。 abort 数其实是用来发送一个SIGABRT信号,这个信号将使当进程终止。 assert是一个宏。调用assert时,它将先计算参数表达式 expression的值,如果为0,则调用abort结束进程。 [exit和_exit区别] 以上关于退出处理数中只有_exit是系统调用数,因此使用man 2 _exit来查看其使用方法,而其余数都是库数,因此使用man 3 数名来查看其使用方法。 exit和_exit使用方法 exit数的具体的说明如下: 需要的头文件如下: #include <stdlib.h> 数族格式如下: void exit(int status); 参数说明: status:设置程序退出码; _exit数的具体的说明如下: 需要的头文件如下: #include <unistd.h> 数族格式如下: void _exit(int status); 参数说明: status:设置程序退出码; 数返回值说明: exit和_exit均无返回值。 atexiton_exit使用方法 atexiton_exit数的具体的说明如下: 需要的头文件如下: #include <stdlib.h> 数族格式如下: int atexit(void (*function)(void)); int on_exit(void (*function)(int , void *), void *arg); 参数说明: atexit数的function参数是一个数指针,指向无返回值和无参数的数; on_exit数的function参数是一个数指针,指向无返回值和有两个参数的数,其中第一个参数是调用exit()或从main中返回时的值,参数arg指针会传给参数function数; 数返回值说明: atexiton_exit调用成功返回0;调用失败返回一个非零值。 注意:atexiton_exit只有在程序使用exit或者main中正常退出时才会有效。如果程序使用_exit、abort或assert退出程序时,则不会执行被注册的数。 案例演示1: 使用atexit注册一个退出数,使其在调用退出被执行,详细代码如下所示: #include <stdlib.h> #include <stdio.h> void out() { printf("程序正在被退出\n"); } int main() { if(atexit(out) != 0) { printf("调用atexit数错误\n"); } return 0; //或者exit(0) } 将以上代码保存为atexit.c文件,编译执行。可以看到执行atexit程序后,out数被调用。 案例演示2: 使用on_exit注册一个退出数,使其在调用退出被执行,详细代码如下所示: #include <stdlib.h> #include <stdio.h> void out(int status, void *arg) { printf("%s(%d)\n", (char *s)arg, status); } int main() { if(on_exit(out, "程序正在被退出") != 0) { printf("调用on_exit数错误\n"); } exit(1); //或者return 1 } 将以上代码保存为on_exit.c文件,编译执行。可以看到执行on_exit程序后,out数被调用,并且status变量的值就是exit数退出的值。 abort和assert使用方法 abort数的具体的说明如下: 需要的头文件如下: #include <stdlib.h> 数族格式如下: void abort(void); assert宏的具体的说明如下: 需要的头文件如下: #include <assert.h> 数族格式如下: void assert(scalar expression); 参数说明: expression:需要被判断的表达式; 注意:assert宏通常用于调试程序数返回值说明: abort和assert无返回值。 案例演示1: 使用abort终止一个程序,详细代码如下所示: #include <stdlib.h> #include <stdio.h> int main() { printf("Hello world\n"); abort(); } 将以上代码保存为abort.c文件,编译执行。可以看到执行abort程序后,程序被强行终止。 编程要求 本关的编程任务是补全右侧代码片段中Begin至End中间的代码,具体要求如下: 补全exitProcess数,使用atexit数注册一个数,在注册数中打印出当进程的ID号。 测试说明 本关的测试需要用户在右侧代码页中补全代码,然后点击评测按钮,平台会自动验证用户是否按照要求去检测结果。
最新发布
12-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值