UNIX环境高级编程篇 (第七章)
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()函数使用时的顺序相反,终止处理程序可以多次注册。