linux中exit()和_exit()函数的作用

exit和_exit函数都是用来终止进程的。当程序执行到exit或_exit时,系统无条件的停止剩下所有操作, 清除包括PCB在内的各种数据结构,并终止本进程的运行。但是,这两个函数是有区别的。

exit()函数的作用是:直接使用进程停止运行,清除其使用的内存空间,并清除其在内核中的各种数据 结构;_exit()函数则在这一基础上做了一些包装。在执行退出之前加了若干道工序。exit()函数与_exit()函 数最大区别就在于exit()函数在调用exit系统之前要检查文件的打开情况,把文件缓冲区的内容写回文件。

由于Linux的标准函数库中,有一种被称作“缓冲I/O”的操作,其特征就是对应每一个打开的文件, 在内存中都有一片缓冲区。每次读文件时,会连续的读出若干条记录,这样在下次读文件时就可以直接从内存 的缓冲区读取;同样,每次写文件的时候也仅仅是写入内存的缓冲区,等满足了一定的条件(如达到了一定数 量或遇到特定字符等),再将缓冲区中的内容一次性写入文件。

这种技术大大增加了文件读写的速度 ,但也给编程代来了一点儿麻烦。比如有一些数据,认为已经写入了文件,实际上因为没有满足特定的条件, 它们还只是保存在缓冲区内,这时用_exit()函数直接将进程关闭,缓冲区的数据就会丢失。因此,要想保证 数据的完整性,就一定要使用exit()函数。

exit的函数声明在stdlib.h头文件中。

_exit的函 数声明在unistd.h头文件当中。

下面的实例比较了这两个函数的区别。printf函数就是使用缓冲I/O的 方式,该函数在遇到“\n”换行符时自动的从缓冲区中将记录读出。实例就是利用这个性质进行比较的。

exit.c源码

#include <stdlib.h>
#include <stdio.h>

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

输出信息:

Using exit...

This is the content in buffer

#include <unistd.h>
#include <stdio.h>

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

则只输出:

Using exit...

说明:在一个进程调用了exit之后,该进程并不会马上 完全小时,而是留下一个称为僵尸进程(Zombie)的数据结构。僵尸进程是一种非常特殊的进程,它几乎已经 放弃了所有的内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程 的退出状态等信息供其它进程收集,除此之外,僵尸进程不再占有任何内存空间。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索内存
, 文件
, 函数
, 进程
, exit
, 缓冲区
, exit()
Exit函数
linux exit函数、linux exit函数头文件、exit 函数的作用是、linux listen函数作用、linux probe函数作用,以便于您获取更多的相关知识。

时间: 2024-11-03 17:11:53

linux中exit()和_exit()函数的作用的相关文章

linux中exit()和

  /***** exit1.c ******/#include<stdio.h>#include<stdlib.h>main(){ printf("output begin/n"); printf("content in buffer"); exit(0);} 使用了exit()函数,结束进程前,把文件缓冲区内容写回文件.这是比较安全的退出方式. 而下面的_exit()函数,结束进程前,不处理缓冲区,直接清空,这样风险比较大.   /***

linux中ln命令的-T参数作用

问题描述 linux中ln命令的-T参数作用 我用man ln命令查看用法,其中对-T参数的解释是 -T, --no-target-directory treat LINK_NAME as a normal file 不明白它的意思,请大家可否举例说明下什么时候才会用到这个参数 解决方案 将链接名当作普通文件(在对目录进行符号链接时要用到此选项) 解决方案二: 我尝试在本目录下ln -s ../ link_a 和 ln -s -T ../ link_b,然后再用ls -al查看link_a和li

linux中fork()函数详解

 一.fork入门知识      一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事.     一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同.相当于克隆了一个自己.      我们来看一个例子: [cpp] view plainco

Oracle中与Sqlserver ISNULL函数类似作用的函数

因项目需求,需将SqlServer转为Oracle,有些SqlServer中的视图使用到了ISNULL函数,找了下,以下的几个Oracle函数与ISNULL具有类似作用: NVL(Expr1,Expr2)如果Expr1为NULL,返回Expr2的值,否则返回Expr1的值 NVL2(Expr1,Expr2,Expr3)如果Expr1为NULL,返回Expr2的值,否则返回Expr3的值   NULLIF(Expr1,Expr2)如果Expr1和Expr2的值相等,返回NULL,否则返回Expr1

linux中常用脚本和函数分享_linux shell

#查找当前目录中是否存在指定目录,若不存在,则创建之 复制代码 代码如下: function mkdir_1{  if test ! -d $1    then     mkdir $1  fi} #指定文件中的"prefix = .*"串替换为"prefix=/home/gnome-unicore-install2/usr/" #可以用来作为sed用法的参考 复制代码 代码如下: function modify_prefix {   chmod +w $1   

linux中fork()函数详解【转】

转自:http://blog.csdn.net/jason314/article/details/5640969 一.fork入门知识      一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事.    一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都复制到新的新进程中,只有少数值与

Linux中mmap与munmap函数系统调用

内存映射函数mmap, 负责把文件内容或者其他对象映射到进程的虚拟内存空间, 通过对这段内存的读取和修改,来实现对文件的读取和修改,而不需要再调用read,write等操作.文件或者其他对象被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零.munmap执行相反的操作,删除特定地址区域的对象映射. 用法: void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offs

linux中]/var/log目录日志的作用详解

位于/var/log/目录之下有许多日志文件,这里记录一下相关用途.其中一些只有特定版本采用,如dpkg.log只能在基于Debian的系统中看到. /var/log/messages - 包括整体系统信息,其中也包含系统启动期间的日志.此外,mail,cron,daemon,kern和auth等内容也记录在var/log/messages日志中. /var/log/dmesg - 包含内核缓冲信息(kernel ring buffer).在系统启动时,会在屏幕上显示许多与硬件有关的信息.可以用

Linux中errno使用

  当linux中的C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因,在实际编程中用这一招解决了不少原本看来莫名其妙的问题.但是errno是一个数字,代表的具体含义还要到errno.h中去阅读宏定义,而每次查阅是一件很繁琐的事情.有下面几种方法可以方便的得到错误信息 (1)void perror(const char *s) 函数说明 perror ( )用来将上一个函数发生错误的原因输出到标