1. 进程退出的方式
1) 正常退出
在main函数中执行return
调用exit函数,并不处理文件描述符,多进程
调用_exit或_Exit.
进程的最后一个线程执行了返回语句
进程的最后一个线程调用pthread_exit函数
2) 非正常退出
调用abort,产生SIGABRT信号
进程接收到某些信号
最后一个线程对“取消”请求做出响应
3) exit()和_Exit() _exit() 退出的区别:
_Exit() _exit()本质是一样的。
exit()函数在退出前允许调用其他的函数做一些收尾工作,_exit()函数要求立即退出进程。
exit()退出前可以调用atexit()注册的函数。
return 其实也会调用atexit()注册的函数。
代码说明:
例子1:exit() 函数查看退出
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("begin\n");
exit(0);
printf("end\n");
return 0;
}
[[email protected] day07]# vi exit1.c
[[email protected] day07]# gcc exit1.c -o exit1
[[email protected] day07]# ./exit1
begin
上面结果说明了,调用了exit(),相当于在这一点就选择了return的作用,退出了程序。
例子2:exit()函数,调用atexit() 函数的效果
#include<stdio.h>
#include<stdlib.h>
void at()
{
printf("at is called\n");
}
int main()
{
atexit(at);//注册了退出前调用的函数
printf("begin\n");
exit(0);
printf("end\n");
return 0;
}
[[email protected] day07]# vi exit2.c
[[email protected] day07]# gcc exit2.c -o exit2
[[email protected] day07]# ./exit2
begin
at is called
上面的结果说明:
执行exit() 函数,程序退出时,可以调用一个函数-atexit()函数,在退出时,调用该函数内的数据;
例子3:_exit() 函数,强制退出
#include <stdio.h>
#include <stdlib.h>
void at()
{
printf("at is called\n");
}
int main()
{
atexit(at);//注册了退出前调用的函数at
printf("begin\n");
_Exit(0);//立即退出,不调用at()
printf("end\n");
return 0;//效果等同于exit()
}
[[email protected] day07]# gcc exit.c -o exit
[[email protected] day07]# ./exit
begin
结果表示:
_exit() 函数,是强制退出,就算有atexit() 函数,也不会调用,相当于机器没有备用电源,直接断电;
例子4: 如果没有用exit等函数,只有return,会如何
#include <stdio.h>
#include <stdlib.h>
void at()
{
printf("at is called\n");
}
int main()
{
atexit(at);//注册了退出前调用的函数at
printf("begin\n");
printf("end\n");
return 0;//效果等同于exit()
}
[[email protected] day07]# vi exit3.c
[[email protected] day07]# gcc exit3.c -o exit3
[[email protected] day07]# ./exit3
begin
end
at is called
结果说明:
return函数,相当于exit,退出还是会调用atexit函数,也就是说,atexit函数,会在退出时,被吊起,但是,需要查看如何退出,如果是_exit() 函数退出,则不会被吊起;