进程终止
进程终止有8种方式,可以分为两类:正常终止(5种)和异常终止(3种)。
正常终止
- 从main函数返回
- 调用exit
- 调用_exit或_Exit
- 最后一个线程返回
- 最后一个线程调用pthread_exit
异常终止
- 调用abort
- 接到一个信号
- 最后一个线程对取消请求做出响应
退出函数
#include <stdlib.h> // ISO C说明
void exit(int status);
void _Exit(int status);
#include <unistd.h> // POSIX说明
void _exit()
- _exit和_Exit立即进入内核,exit会执行一些清理处理(标准IO清理关闭),然后返回内核
- main函数返回一个整型值和用该值调用exit是等价的,即在main函数中exit(0)等价于return (0)
函数atexit
用于登记进程终止处理程序,这些程序由exit函数自动调用。
- 最多支持登记32个
- exit调用这些函数与登记顺序相反
- 同一个函数登记多次也会被调用多次
例子
static void my_exit1(void);
static void my_exit2(void);
int main()
{
if (atexit(my_exit2) != 0)
err_sys("can't register my_exit2");
if (atexit(my_exit1) != 0)
err_sys("can't register my_exit1");
if (atexit(my_exit1) != 0)
err_sys("can't register my_exit1");
printf("main is done\n");
return 0; // 等价于exit(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