exit、_Exit、_exit和atexit

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()函数使用时的顺序相反,终止处理程序可以多次注册。





你可能感兴趣的:(exit、_Exit、_exit和atexit)