进程退出表示进程即将结束退出 . 在linux系统里进程退出的方法分为正常退出和异常退出两种 . 其中正常退出的方法有三种,异常退出的方法有两种 .
<1> 正常退出
1. 在main函数中执行 return
2. 调用 exit函数
3. 调用 _exit 函数
<2> 异常退出
1. 调用 about 函数
2. 进程收到某个信号, 而该信号使程序终止
不管是哪种退出方式, 最终都会执行内核中的同一段代码. 这段代码用来关闭进程所有已打开的文件描述符 , 释放它所占有的内存和其它资源.下面主要来说一说关于 exit , _exit这两个的异同吧
1.exit 和 _exit函数都是用来终止进程的 . 当程序执行到 exit 和 _exit 时,系统无条件的停止剩下所有操作,清除包括PCB在内的各种数据结构, 并终止本进程的运行.
2. exit在头文件 stdlib.h 中声明 , _exit在头文件unistd.h 中声明 . 并且 exit 中的参数为0 代表进程正常终止, 若为其他值则表示程序执行过程中有错误发生.
3. _exit 执行后立即返回给内核, 而exit腰执行一些清除操作, 然后将控制权交给内核 .
4. 调用_exit函数时,其会关闭进程所有的文件描述符, 清理内存以及其它一些内核清理函数, 但不会刷新流(stdin, stdout, studerr) . exit函数是在_exit函数之上的一个封装, 其会调用_exit ,并在调用之前先刷新流.
5. exit函数和_exit函数最大的区别就在于exit函数在调用exit系统之前要检查文件的打开情况 ,把文件缓冲区的内容写回文件. 由于linux的标准函数库中, 有一种被称作 " 缓冲I/O" 的操作, 其特征就是对应每一个打开的文件, 在内存中都有一片缓冲区 , 每次在读文件时, 会连续的读出若干条记录, 这样在下次读文件时就可以直接从内存的缓冲区读取 . 同样, 每次写文件时,也仅仅是写入内存的缓冲区, 等满足了一定的条件(如达到了一定的数目或遇到特定字符等). 再将缓冲区中的内容一次性的写入文件.这种技术大大增加了文件的读写速度, 但也给编程带来了一点麻烦. 比如有一些数据, 认为已经写入了文件, 实际上因为没有满足特定的条件,它们还只是保存在缓冲区内的. 这时用_exit函数直接将进程关闭, 缓冲区的数据就会丢失. 因此, 想要保证数据的完整性, 就一定要使用exit函数.