[7 进程环境]使用atexit函数注册终止处理函数

下图显示了一个C程序是如何启动和正常关闭的:

图1 C程序是如何启动和正常关闭的

1 启动

C程序总是从main函数开始执行,内核是通过exec函数调用一个C启动例程再调用的main函数。C启动例程从内核获取命令行参数和环境变量,为调用main函数做好准备。

2 关闭

有8种方式可以使进程关闭,5种正常终止,3种异常终止。
正常终止:
(1)从main返回
(2)调用exit
(3)调用_exit或_Exit
(4)最后一个线程从C启动例程返回
(5)最后一个线程调用phtread_exit()
异常终止:
(1)调用abort
(2)接收一个信号
(3)最后一个线程对取消请求做出响应
这里先介绍两个方式。

2.1 _exit或_Exit

_exit或_Exit会立即进入内核。

2.2 exit

exit会首先条用atexit注册的终止处理函数,然后通过fclose关闭所有打开流,最后进入内核。
atexit函数:

#include <stdlib.h>
//ret:success返回0; fail返回非0
int atexit(void (*func)(void));

atexit函数注册终止处理程序,这些函数将由exit自动调用,调用的顺序与注册时顺序相反,同一函数如果注册多次也会被调用多次。一个进程最多注册32个终止处理函数。

3 使用atexit函数注册终止处理函数

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

static void    my_exit1(void);
static void    my_exit2(void);

int main(void)
{
    if (atexit(my_exit2) != 0)
        printf("can't register my_exit2");

    if (atexit(my_exit1) != 0)
        printf("can't register my_exit1");
    if (atexit(my_exit1) != 0)
        printf("can't register my_exit1");

    printf("main is done\n");
    return(0);
}

static void my_exit1(void)
{
    printf("first exit handler\n");
}

static void my_exit2(void)
{
    printf("second exit handler\n");
}

输出:

main is done
first exit handler
first exit handler
second exit handler

调用的顺序与注册时顺序相反,同一函数如果注册多次也会被调用多次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值