linux 之进程基础 (五)、进程API之进程终止API
5 . 进程终止API
5.1 exit()函数和_exit()函数
exit()和_exit()函数都是用来终止进程的。当程序执行exit()和_exit()时,进程会无条件的停止剩下的所有操作。清除各种数据结构,并终止本进程的运行。但是这个两个函数运行还是有点区别的。
5.2 exit()函数和_exit()函数 的区别
5.2.1exit()函数和_exit()函数 的区别 示意图
- _exit()函数的作用最为简单:直接使进程终止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;
- exit()函数则在这些基础上作了一些包装,在执行退出之前加了若干道工序。exit()函数在调用exit系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件,就是图中的"清理I/O缓冲"一项。
总结:
- Exit() 函数相当于在_exit上面加了一层封装
- _exit() 结束程序不清理缓冲区。
5.1.2 exit()函数和 return 关键字
return 和 exit的区别
- return是关键字exit是函数;
- exit是系统级的它表示进程的结束,而return是语言级的它表示函数调用堆栈返回。
- main函数中return 0会隐式的调用exit(). 因此 程序结束的时候会清理缓冲区。
5.1.3 实验验证exit()和 _exit()函数
//文件1:test_exit.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int
main()
{
printf("hello world");
_exit(0);
}
//文件2test_exit2.c
#include <stdio.h>
#include <stdlib.h>
int
main()
{
printf("hello world");
exit(0);
}
将上述代码编译后分别命名为:
- test_exit
- test_exit2
执行后的结果如下:
可以看到由于_exec() 函数不刷新缓冲区,因此不会在终端中打印。