阿牧路泽

哪有那么多坚强,无非是死扛罢了
  博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

14、【C语言基础】__exit() exit() return的区别

Posted on 2018-09-19 11:47  阿牧路泽  阅读(537)  评论(0)    收藏  举报

__exit()  exit() return的区别

_exit()  --- 直接结束进程进入到内核中
exit()    --- 清理I/O缓冲区后再退出进程
return   --- 函数返回

【实例】

__exit():

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <unistd.h>
 4 
 5 int main()
 6 {
 7     int ret = 0;
 8     printf("I'm ok!\n");
 9     printf("Good good study!");
10 
11     _exit(0);
12 }

执行结果:

I'm ok!

 【实例】

exit()

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <unistd.h>
 4 
 5 int main()
 6 {
 7     int ret = 0;
 8     printf("I'm ok!\n");
 9     printf("Good good study!");
10 
11     exit(0);
12 }

执行结果:

I'm ok!
Good good study!

当把第二个输出信息后面加一个"\n";两个程序的结果都会输出相同的结果,两个打印信息都会打印出来。

原因如下:

printf函数就是使用的是缓冲I/O的方式,该函数在遇到“\n“换行符时自动的从缓冲区中将记录读出。所以exit()将缓冲区的数据写完后才能退出来,所以调用exit()函数后程序并不会马上退出,这就是有些出现的僵尸程序,而_exit是直接退出进入到内核中去。

总的来说_exit()执行后会立即返回给内核,而exit()会先执行一些清除操作然后将控制权交给内核,就是说在调用_exit函数的时候它会关闭所有的文件描述符,清理内存和其他的一些内核清理函数,但是不会刷新(stdin,stdout,stderr...),而exit就是在调用_exit()函数的前面先刷新流。

 注:
1、return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,它表示了一个进程的结束
2、return是返回函数调用,如果返回的是main函数,则为退出程序
3、exit是在调用处强行退出程序,运行一次程序就结束