进程终止(UNIX环境高级编程笔记)

  有8种方式使进程终止(termination),其中5种为正常终止,它们是:
  (1)从main返回;
  (2)调用exit;
  (3)调用_exit或_EXIT;
  (4)最后一个线程从其启动例程返回;
  (5)从最后一个线程调用pthread_exit。
  异常终止有3中方式:
  (6)调用abort;
  (7)接到一个信号;
  (8)最后一个线程对取消请求做出响应。

退出函数

  3个函数用于正常终止一个程序:_exit和_EIXT立即进入内核,eixt则先执行一些清理处理再返回内核。

#include <stdlib.h>
void exit(int status);
void _EXIT(int status);
#include <unistd.h>
void _exit(int status);

  由于历史原因,exit函数总是执行一个标准I/O库的清理关闭操作:对所有打开流调用fclose函数。这造成所有输出缓冲流中的所有函数中的所有数据都被冲洗(写到文件上)。
  3个退出函数都带一个整形参数,称为终止状态(或退出状态,exit status)。大多数UNIX系统shell都提供给检查进程终止状态的方法(echo $?)。
  main函数返回一个整型值与用该值调用exit是等价的。

  2.函数atexit

  按照ISO C的规定,一个进程最多可以登记32个函数,这些函数将由exit自动调用。我们称这些函数为终止处理程序(exit handler),并调用atexit函数来登记这些函数。

#include <stdlib.h>
int atexit(void (*func)(void));
          返回值:若成功,返回0;若出错,返回非0

  其中atexit的参数是一个函数地址,当调用函数时无需向它传递任何参数,也不期望它返回一个值。exit调用这些函数的顺序与它们登记时候的顺序相反。同一函数若登记多次,也将执行多次。
  根据ISO C和POSIX.1,exit首先调用各终止处理程序,然后通过fclose关闭所有打开的流。下图显示了一个C程序是如何启动的,以及它终止的各种方式。
进程终止(UNIX环境高级编程笔记)