exit()和_exit()函数
函数说明
创建进程使用fork()函数,执行进程使用exec函数族,终止进程则使用exit()和_exit()函数。当进程执行到exit()或_exit()函数时,进程会无条件的停止剩下的所有操作,清除各种数据结构,并终止本进程的运行。但是,这两个函数还是有区别的,其调用过程如图1所示:
从图1可以看出,_exit()函数的作用是:直接使进程停止运行,清除其使用的内存空间,并清除其在内核中的各种数据结构;而exit()函数则在这些基础上做了一些包装,在执行退出之前加了若干道工序。exit()函数和_exit()函数的最大区别就在于exit()函数在终止当前进程之前要检查该进程打开过哪些文件,把文件缓冲区中的内容写回文件,也就是图1中的“清理I/O缓冲”一项。
在Linux的标准函数库中,有一种被称作“缓冲I/O(buffered I/O)”的操作,其特征就是对应每一个打开的文件,在内存中都有一片缓冲区。
每次读文件时,会连续读出若干条记录,这样在下次读文件时就可以直接从内存的缓冲区中读取;同样,每次写文件时,也仅仅是写入内存中的缓冲区,等满足了一定的条件(如达到一定数量或遇到特定字符等,最典型的就是咱们的vim中使用的:w命令),再将缓冲区中的内容一次性写入文件。
这种技术大大增加了文件读写的速度,但也给咱们的编程带来了一些麻烦。比如有些数据你认为已经被写入到文件中,实际上因为没有满足特定的条件,它们还只是被保存在缓冲区内,这时用_exit()函数直接将进程关闭掉,缓冲区中的数据就会丢失。因此,若想保证数据的完整性,最好使用exit()函数。
函数语法
下表列出了exit()和_exit()函数的语法要点:
基础实验
以下两个基础实验1比较了exit()和_exit()函数的区别。由于 printf()函数使用的是缓冲I/O方式,该函数在遇到“\n”换行符时自动从缓冲区中将记录读出,以下两个基础实验就是利用这个性质来进行比较的。以下为实验1的代码:
执行结果如下图
从输出的结果可以看到,调用exit()函数时,缓冲区中的记录也能正常输出。
实验2的代码如下:
执行结果如下图:
从最后的结果可以看到,调用_exit()函数无法输出缓冲区中的记录。
如果在实验2中的代码中的 第二个代码加上回车符,那么结果会有不同了。自己试试哈!
相关推荐
【头歌Linux系统编程之C编程入门】是一个关于在Linux...这个教程涵盖了从C语言基础到Linux系统编程的多个方面,适合对Linux系统编程感兴趣的初学者,通过学习可以提升C语言编程能力和在Linux环境下的系统级开发能力。
### Linux编程基础——线程的练习实验四 #### 实验目的 本次实验旨在通过实际操作加深对Linux下线程管理的理解,重点掌握线程的创建与同步机制,具体任务为编写一个程序,该程序能够创建一个新的线程来计算并输出...
### 实验七:深入理解Linux多线程编程 #### 实验背景与目标 随着计算机技术的发展,多核处理器已经成为主流,为了充分利用硬件资源并提高软件性能,多线程编程技术得到了广泛的应用。本实验旨在帮助学生掌握Linux...
总结,Linux内核驱动模块编程涉及的内容广泛,涵盖硬件抽象、中断处理、I/O操作等多个方面。熟练掌握这些知识,将有助于开发者构建高效、可靠的Linux驱动程序,为各种硬件设备提供支持。通过阅读中文文档和实际操作...
Linux Shell编程是Linux...通过这些实验,学生将能深入理解Shell编程的基础知识,包括变量、控制结构和文件操作,从而提高Linux系统的操作和管理能力。在实际工作中,Shell脚本可以极大地提高工作效率,简化日常任务。
UNIX/Linux系统通常采用多用户、多任务的体系结构,由内核、shell、应用程序等部分组成。内核负责管理硬件资源并提供核心服务;shell作为用户与系统的接口,用于执行命令和脚本;应用程序则提供具体的用户功能。 **...
一旦线程完成其任务,可以使用`pthread_exit()`函数来结束线程。这个函数接受一个参数,即线程的退出状态,可以用来向主线程或其他线程传递线程的执行结果。 为了确保主线程能够等待并收集子线程的退出状态,`...
但基于标题“Linux并发编程实验(线程、进程)”和描述“Linux并发编程实验(线程、进程)”可以推测,文档可能涉及到Linux系统下进程和线程的概念,以及如何在Linux系统中实现并发编程。下面我将基于这些信息,尽可能...
操作系统实验报告1-Linux操作、使用、编程与进程创建的实验主要涵盖了以下几个核心知识点: 1. **Linux操作系统基础**:Linux是一种开源的操作系统,它的字符界面提供了丰富的命令行工具供用户进行系统管理。实验中...
本实验指导书详细介绍了Linux内核实验环境的搭建、内核编程的特点以及各种具体的实验内容。通过这些实验,学生不仅可以深入了解Linux内核的工作原理,还可以掌握内核开发的基本技能,为进一步研究和开发奠定坚实的...
### 实验九:Shell编程基础知识点详解 #### 一、Shell编程概述 Shell是Linux操作系统中的一个重要组成部分,它充当用户与内核之间的交互界面。Shell不仅是一个命令解释器,允许用户通过命令行输入各种指令来控制...
在Linux操作系统中,多线程编程是一种常见的技术,它允许程序在同一时间执行多个并发任务,以提高系统的效率和响应性。本实验通过创建多个线程,分别用于执行矩阵乘法和计算斐波那契数列,展示了多线程在并发处理...
它基于Unix的设计思想,具有高度稳定性和安全性,支持多用户、多任务和多线程处理,适用于服务器、桌面电脑、移动设备等多领域。 - **学习和动手安装Linux操作系统。** 掌握Linux的安装流程,包括选择合适的发行版...
- **定义与历史**: UNIX是一种多用户、多任务的操作系统,由AT&T贝尔实验室在20世纪70年代初开发出来。它以其稳定性和可移植性而著称,成为后来许多操作系统(包括Linux和macOS)的基础。 - **主要特性**: - **多...
10. **内核模块编程**:学习如何编写、加载和卸载内核模块,以及如何利用`module_init()`和`module_exit()`函数初始化和清理模块。 通过这些实验,学生不仅可以提升编程技能,还能深入了解Linux内核的工作原理,这...
Shell是一种强大的命令行解释器,同时也是编程语言,用户可以通过编写Shell脚本来自动化Linux系统的各种任务。 1. **Shell编程基础** - **实验目的**:掌握Shell编程基本方法,理解基础知识,学习编写Shell脚本。 ...
- **Linux内核:** Linux内核是运行在嵌入式系统中的核心部分,负责管理硬件资源、提供底层服务并支持多任务处理等功能。了解Linux内核的工作原理对于开发高效的嵌入式应用程序至关重要。 **2. 内核模块基础** - *...