exit()和_exit()函数

分享到:
           

    1)exit()和_exit()函数说明

    exit()和_exit()函数都是用来终止进程的。当程序执行到exit()或_exit()时,进程会无条件地停止剩下的所有操作,清除各种数据结构,并终止本进程的运行。但是,这两个函数还是有区别的,其调用过程如图1所示。


图1 exit()和_exit()函数流程图

    从图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()函数语法要点

所需头文件 exit:#include <stdlib.h>
_exit:#include <unistd.h>
函数原型 exit:void exit(int status)
_exit:void _exit(int status)
函数传入值 status是一个整型的参数,可以利用这个参数传递进程结束时的状态。一般来说,0表示正常结束;其他的数值表示出现了错误,进程非正常结束。
在实际编程时,可以用wait()系统调用接收子进程的返回值,针对不同的情况进行不同的处理

    3)exit()和_exit()使用实例

    以下两个示例比较了exit()和_exit()函数的区别。由于printf()函数使用的是缓冲I/O方式,该函数在遇到“\n”换行符时自动从缓冲区中将记录读出。以下示例中就是利用这个性质来进行比较的。示例1的代码如下:

    /* exit.c */
    #include <stdio.h>
    #include <stdlib.h>

    int main()
    {
        printf("Using exit...\n");
        printf("This is the content in buffer");
        exit(0);
    }
    $ ./exit
    Using exit...
    This is the content in buffer $

    读者从输出的结果中可以看到,调用exit()函数时,缓冲区中的记录也能正常输出。

    示例2的代码如下:

    /* _exit.c */
    #include <stdio.h>
    #include <unistd.h>

    int main()
    {
        printf("Using _exit...\n");
        printf("This is the content in buffer"); /* 加上回车符之后结果又如何 */
        _exit(0);
    }
    $ ./_exit
    Using _exit...
    $

    读者从后的结果中可以看到,调用_exit()函数无法输出缓冲区中的记录。

    本文选自华清远见嵌入式培训教材《从实践中学嵌入式Linux应用程序开发》

   热点链接:

   1、Linux下多进程编程之exec函数语法及使用实例
   2、Linux下多进程编程之fork()函数语法
   3、Linux下多进程编程之fork()函数说明
   4、Linux下多任务系统之线程介绍
   5、Linux下进程的内存结构

更多新闻>>