进程的退出方式

进程退出有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函数中代表着结束本进程,如果不是,则返回上一层调用。

猜你喜欢

转载自blog.csdn.net/nuyexiaoxiang/article/details/79527803