(1)正常终止:
(a)在main函数内执行return语句。这等效于调用exit。
(b)调用exit函数
(c)调用_exit系统调用函数
(2)异常终止:
(a)调用abort。它产生SIGABRT信号,所以是一种异常终止的一种特列。
(b)当进程接收到某个信号时。例如,进程越出其地址空间访问存储单元,或者除以0,内核就会为该进程产生相应的信号。
注意:不管进程如何终止,最后都会执行内核中的同一段代码。这段代码为相应进程关闭所有打开描述符,释放它所使用的存储器等。
exit和_exit的不同
_exit()函数的作用最为简单:直接进程停止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;
exit()函数与_exit()函数最大的区别就在于exit()函数在调用exit系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件,就是"清理I/O"缓冲。
探究 1._exit()
//_exit(0) exit(0) return 0
编译运行结果:
从上面我们看到,test.txt的内容为空.为什么呢?因为标准I/O函数是带缓存的,进行fputs的时候是先向缓存中写的,只有当缓存满的时候才会刷新的缓冲区的。从以上我们发现,当进程退出时,执行_exit()函数并没有刷新缓冲区的数据,而是直接终止进程的。
探究2.exit()
编译运行结果:
从上面我们可以看到,
当exit()函数结束进程的时候,对缓存进行了处理,把缓存的数据写到了磁盘文件中。