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() 函数不刷新缓冲区,因此不会在终端中打印。

posted @ 2020-03-25 21:05  江南又一春  阅读(365)  评论(0编辑  收藏  举报