exit()和_exit()函数 |
||||||||
1)exit()和_exit()函数说明 exit()和_exit()函数都是用来终止进程的。当程序执行到exit()或_exit()时,进程会无条件地停止剩下的所有操作,清除各种数据结构,并终止本进程的运行。但是,这两个函数还是有区别的,其调用过程如图1所示。
从图1中可以看出,_exit()函数的作用是:直接使进程停止运行,清除其使用的内存空间,并清除其在内核中的各种数据结构;exit()函数则在这些基础上做了一些包装,在执行退出之前加了若干道工序。exit()函数与_exit()函数大的区别就在于exit()函数在终止当前进程之前要检查该进程打开过哪些文件,把文件缓冲区中的内容写回文件,也就是图3.5中的“清理I/O缓冲”一项。 由于在Linux的标准函数库中,有一种被称做“缓冲I/O(buffered I/O)”的操作,其特征就是对应每一个打开的文件,在内存中都有一片缓冲区。 每次读文件时,会连续读出若干条记录,这样在下次读文件时就可以直接从内存的缓冲区中读取;同样,每次写文件时,也仅仅是写入内存中的缓冲区,等满足了一定的条件(如达到一定数量或遇到特定字符等),再将缓冲区中的内容一次性写入文件。 这种技术大大增加了文件读写的速度,但也为编程带来了一些麻烦。比如有些数据认为已经被写入到文件中,实际上因为没有满足特定的条件,它们还只是被保存在缓冲区内,这时用_exit()函数直接将进程关闭掉,缓冲区中的数据就会丢失。因此,若想保证数据的完整性,好使用exit()函数。 2)exit()和_exit()函数语法 表1列出了exit()和_exit()函数的语法要点。 表1 exit()和_exit()函数语法要点
3)exit()和_exit()使用实例 以下两个示例比较了exit()和_exit()函数的区别。由于printf()函数使用的是缓冲I/O方式,该函数在遇到“\n”换行符时自动从缓冲区中将记录读出。以下示例中就是利用这个性质来进行比较的。示例1的代码如下: /* exit.c */ 读者从输出的结果中可以看到,调用exit()函数时,缓冲区中的记录也能正常输出。 示例2的代码如下: /* _exit.c */ 读者从后的结果中可以看到,调用_exit()函数无法输出缓冲区中的记录。 本文选自华清远见嵌入式培训教材《从实践中学嵌入式Linux应用程序开发》 热点链接:
1、Linux下多进程编程之exec函数语法及使用实例 |