进程退出有8种方式:
三种正常的退出方式
1.从main函数退出
2.调用exit
3.调用_exit_EXIT
后五种为异常退出方式
4.最后一个线程从启动历程返回
5.最后一个线程调用pthread_exit
6.调用abort
7.接到一个信号并终止
8.最后一个线程对取消请求做出响应
先来认识下exit()与_exit()的区别
区别1:清空缓冲区的设置
[root@localhost myexit]# gcc testexit.c
[root@localhost myexit]# ./a.out
[root@localhost myexit]# cat testexit.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
printf("hello");
_exit(0);
}
可以明显看出调用_exit()函数,缓存区的内容并没有被刷新出来。
区别二:调用终止处理程序
atexit()函数:
:可以用来注册终止处理程序,ANSI C规定最多可以注册32个终止处理程序。
:终止处理程序的调用与注册顺序相反
来看下atexit()函数的原型
int atexit(void (*function)(void)); //参数呢是一个函数指针,返回类型与参数类型都为void
测试下
[root@localhost myexit]# gcc testatexit.c
[root@localhost myexit]# ./a.out
------------
at2
at1
[root@localhost myexit]# cat testatexit.c
#include<stdio.h>
#include<stdlib.h>
void at1( void )
{
printf("at1\n");
}
void at2( void )
{
printf("at2\n");
}
int main()
{
atexit(at1);
atexit(at2);
printf("------------\n");
exit(0);
}
//调用_exit()函数退出
[root@localhost myexit]# gcc testatexit.c
[root@localhost myexit]# ./a.out
------------
return与exit的区别
主要来说exit是系统调用级别的,代表着一个进程的结束。它会删除进程的内存空间,同时把错误信息返回给父进程,通常情况,exit(0)表示正常退出,exit(1)和exit(-1)表示程序异常退出,exit(2)表示程序找不到指定的文件。在整个程序中,只要调用exit就结束。
return是语言级别的,代表着调用堆栈的返回。如果在main函数中代表着结束本进程,如果不是,则返回上一层调用。