Linux注册进程终止处理函数

2026-10-040

atexit() 是一个标准库函数,用于注册在进程正常终止时要调用的函数。通过它可以在程序结束时自动执行清理工作,例如释放资源、保存状态或写入日志。

函数原型

#include <stdlib.h>
int atexit(void (*function)(void));

参数和返回值

  • function 是函数指针,指向程序正常终止时执行的函数。该函数不接收参数,也没有返回值,签名必须是 void function_name(void)。
  • 成功注册返回 0;失败返回非零值,通常表示系统资源耗尽或已达到注册限制。

常见用途包括关闭文件、释放动态内存,以及保存程序状态或日志。需要注意,注册函数只会在程序通过 exit() 正常终止时运行;通过 _exit() 或 _Exit() 终止时会跳过正常退出流程。

单个退出处理函数

下面的示例在程序正常退出时输出一条消息:

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

static void bye(void) {
    puts("Goodbye!");
}

int main(void) {
    if (atexit(bye)) {
        fprintf(stderr, "cannot set exit function\n");
        exit(-1);
    }

    exit(0);
}

运行后会输出 Goodbye!。

多个退出处理函数

可以多次调用 atexit()。处理函数按照注册顺序的相反顺序执行,符合后进先出(LIFO)规律:

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

static void bye1(void) {
    puts("Goodbye 1!");
}

static void bye2(void) {
    puts("Goodbye 2!");
}

int main(void) {
    atexit(bye1);
    atexit(bye2);
    exit(0);
}

输出顺序为:

Goodbye 2!
Goodbye 1!

atexit() 能保证正常退出时完成必要清理,但无法覆盖异常终止场景。实际开发中应根据退出路径选择合适的资源回收策略。

来源:Linux注册进程终止处理函数(CSDN,原作者“不脱发的程序猿”,CC BY-SA 4.0)

创作许可协议

本项目采用 CC BY(署名) 进行许可。

评论(0)
- 没有更多了 -