函数原型如下:
#include <stdlib.h>int on_exit(void (*function)(int, void *), void *arg);
参数列表
– `function`: 用户自定义的进程退出清理函数 。
– `arg`: `void *`类型的自定义参数 。
返回值
成功返回0,非0值则表示失败 。
示例#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>void cleanup1() {fprintf(stderr, "[1]cleanup\n");sleep(1);}void cleanup2() {fprintf(stderr, "[2]cleanup\n");sleep(1);}void cleanup3(int status, void *arg) {fprintf(stderr, "[3]cleanup: %s\n", (char *)arg);sleep(1);}int main(int argc, char *argv[]) {if (argc != 2) {fprintf(stderr, "Usage: %s exit|_exit|_Exit|return\n", argv[0]);return EXIT_FAILURE;}// atexit注册自定义清理函数atexit(cleanup1);atexit(cleanup2);atexit(cleanup2); // 多次注册同一个函数// 非标准函数on_exit,仅Linux下有效// on_exit(cleanup3, (void *)"bye!!!");// on_exit(cleanup3, (void *)"bye!!!"); // 多次注册同一个函数fprintf(stdout, "a newline!\n"); // 向stdout写入带换行符的字符串(行缓冲,遇到换行符的情况下就会调用write系统调用输出内容)fprintf(stderr, "[stderr]a newline!"); // 向stderr写入不带换行符的字符串(stderr默认情况下无缓冲,直接调用write系统调用)fprintf(stdout, "[stdout]forgot a newline!"); // 向stdout写入不带换行符的字符串(若不刷新缓冲区,则该行内容不会被输出)if (strcmp("exit", argv[1]) == 0) {// 作用:执行一些前置的清理操作并终止当前进程// 标准库函数(C89)// #include <stdlib.h>// 调用exit函数会执行以下操作:// 1、调用用户注册的清理函数// 2、刷新缓冲区并关闭所有标准IO流// 3、删除临时文件// 4、调用_exit系统调用exit(0);} else if (strcmp("_Exit", argv[1]) == 0) {// 作用:直接终止当前进程(含进程的所有线程)// 标准库函数(C99)// #include <stdlib.h>// 效果等同于_exit,但移植性更好 。_Exit(0);} else if (strcmp("_exit", argv[1]) == 0) {// 作用:直接终止当前进程(含进程的所有线程)// 是对exit_group系统调用的包装(可退出所有线程)// #include <unistd.h>_exit(0);}return EXIT_SUCCESS; // main函数return会调用exit函数}
推荐阅读
- JAVA开发语言介绍 java语言概述题库
- 微信平台投票制作 微信投票程序怎么制作?
- c语言圆的面积编程 c语言阶乘函数怎么写
- python教程 疯狂的python建议怎么样
- 投票小程序制作 微信小程序是怎么制作的?
- 说话技巧和应变能力的书 看什么书可以提高语言表达能力?
- 怎样退出相互宝,按照这流程操作可以退出
- 董事长变更为周航 曹操出行将迎来大动作?吉利控股CEO退出
- 质量效应传奇版有中文吗 质量效应传奇版语言选项一览
- 足球经理2021语言强化怎么看 足球经理2021语言强化训练详解