unix系统中,有8种方式可以使进程终止,其中五种为正常终止,三种为异常终止。
五种正常终止方式为:
1.从mian返回
2.调用exit()
3.调用_exit()或_Exit()
4.最后一个线程从启动例程返回5.最后一个现成调用pthread_exit
三种异常终止方式:
6.调用abort()
7.接到一个信号并终止
8.最后一个线程对取消请求作出响应
/////////////////////exit函数/////////////////
函数原型:
#include<stdlib.h>
void exit(int status);
void _Exit(int status);
//上两个函数由ISO C说明
8.最后一个线程对取消请求作出响应。
#include<unistd.h>
void _exit(int status);
//该函数由POSIX.1说明
之前在main函数中一直使用的return(0)等价于exit(0)
当调用exit()时,程序会调用一些终止处理程序、标准IO清理程序等,然后再跳入内核结束程序;
而调用_exit()或者_Exit()时,程序会直接跳入内核结束程序。(有可能导致数据的未保存!)
______________________________________________________________________________
///////////////////atexit函数////////////////////
#include<stdlib.h>
int atexit( void (func*) (void) ); //返回值:若成功则返回0,若出错则返回非0值
atexit的参数是一个函数地址,当调用此函数时无需向它传送任何参数,也不期望它返回一个值。
exit调用这些函数的顺序与它们登记时候的顺序相反,下面举例(与原书大致相同,有所修改):
#include<stdlib.h> #include<stdio.h> #include<sys/types.h> #include<unistd.h> statiic void my_exit1(void) { printf("first exit handler.\n"); } statiic void my_exit2(void) { printf("second exit handler.\n"); } int main(void) { if( atexit( my_exit2) != 0) printf("Can't register my_exit2.\n"); if( atexit( my_exit1) != 0) printf("Can't register my_exit1.\n"); if( atexit( my_exit1) != 0) printf("Can't register my_exit1.\n"); printf("main is done.\n"); return(0); }
测试效果:
$ ./a.out
main is done.
first exit handler.
first exit handler.
second exit handler.
验证了注册的顺序与exit()函数使用时的顺序相反,终止处理程序可以多次注册。