进程终止

进程终止有8种方式,可以分为两类:正常终止(5种)和异常终止(3种)。

正常终止

  1. 从main函数返回
  2. 调用exit
  3. 调用_exit或_Exit
  4. 最后一个线程返回
  5. 最后一个线程调用pthread_exit

异常终止

  1. 调用abort
  2. 接到一个信号
  3. 最后一个线程对取消请求做出响应

退出函数

#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

posted @ 2022-05-22 19:26  Galaxy_hao  阅读(143)  评论(0编辑  收藏  举报