exit 和_exit 的区别与联系

exit 和_exit 函数用于正常终止一个程序;

_exit 立即进入内核,exit 则先执行一些清除处理(包括调用执行各终止处理程序,关闭所有标准I / O 流等),然后进入内核。


_exit()立即进入,printf输出的内部可能还在缓冲区里,未作清理,就进入内核,执行进程退出,这样你后面一个输出就可能未能输出到屏幕


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)的数据结构。僵尸进程是一种非常特殊的进程,它几乎已经放弃了所有的内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其它进程收集,除此之外,僵尸进程不再占有任何内存空间





abort()使程序异常退出,exit()可以有传入值。 

--------------------------------------------------------------- 
abort writes a termination message on stderr ("Abnormal program 
termination"), then aborts the program by a call to _exit with exit code 3. 

exit terminates the calling process. Before termination, exit does the 
following: 
closes all files 
writes buffered output (waiting to be output) 
calls any registered "exit functions" (posted with atexit) 
--------------------------------------------------------------- 
exit()可以指定退出的状态,正常或者出错。 
abort()好像只是退出程序而已。 
--------------------------------------------------------------- 
exit()退出前先要执行vatexit()设置的函数 
abort()使程序非正常退出 
--------------------------------------------------------------- 

abort()仅仅使程序退出,啥也不做. 
exit()在退出前要做一些清理工作. 
--------------------------------------------------------------- 
在华中科技大学《C++程序设计实践教程》中,谈到这一区别: 
按面向对象的思想,程序也是一个对象,因此,程序也有生有死。 
C++在编译一个程序后,这样执行程序:(1)执行开工函数,此时对 
程序初始化,主要指全局变量初始化。(2)调用main函数。(3)执行 
收工函数,对全局变量(对象)进行析构。所以如下程序会有输出, 
尽管main函数为空: 
#include <stdio.h> 
int  x=printf("ABCDEF"); 
void main( ){ } 
现在,来谈abort和exit以及return的区别。return返回,可析构 
main或函数中的局部变量,尤其要注意局部对象,如不析构可能造成 
内存泄露。exit返回不析构main或函数中的局部变量,但执行收工函数, 
故可析构全局变量(对象)。abort不析构main或函数中的局部变量,也不 
执行收工函数,故全局和局部对象都不析构。 
所以,用return更能避免内存泄露,在C++中用abort和exit都不是好 
习惯。 
请给分。 
--------------------------------------------------------------- 

exit() 
Terminate the calling process after cleanup (exit) or immediately (_exit). 
abort() 
Aborts the current process and returns an error code

____________________________________________________________

 #include <stdlib.h>

exit_exit函数用于正常终止一个程序: _exit立即进入内核,exit则先执行一些清除处理(包括调用执行各终止处理程序,关闭所有标准I / O流等),然后进入内核。使用不同头文件的原因是:exit是由ANSI C说明的,而_exit则是由POSIX.1说明的。
       由于历史原因,exit函数总是执行一个标准I/O库的清除关闭操作:对于所有打开流调用 fclose 函数。exit_exit都带一个整型参数,称之为终止状态(exit status)。大多数UNIX shell都提供检查一个进程终止状态的方法。如果( a )若调用这些函数时不带终止状态,或( b ) main执行了一个无返回值的re turn语句,或( c ) main执行隐式返回,则该进程的终止状态是末定义的。这就意味着,下列经典性的C语言程序:
             #include <stdio.h>
             main ()
             {
                      printf ("hello, world /n");
             }
       是不完整的,因为main函数没有使用return语句返回(隐式返回),它在返回到C的起动例程时并没有返回一个值(终止状态)。另外,若使用:
               return( 0 ) ;或者
               exit( 0 );
        则向执行此程序的进程(常常是一个shell进程)返回终止状态0。另外,main函数的说明实际上应当是:
                                             int main(void)
       将main说明为返回一个整型以及用exit代替return,对某些C编译程序和UNIX lint(1)程序而言会产生不必要的警告信息,因为这些编译程序并不了解main中的exit与return语句的作用相同。警告信息可能是“ control reaches end of nonvoid function(控制到达非void函数的结束处)”。避开这种警告信息的一种方法是:在main中使用return语句而不是exit。但是这样做的结果是不能用UNIX的grep公用程序来找出程序中所有的exit调用。另外一个解决方法是将main说明为返回void而不是int,然后仍旧调用exit。这也避开了编译程序的警告,但从程序设计角度看却并不正确。本章将main表示为返回一个整型,因为这是ANSIC和POSIX.1所定义的。我们将不理会编译程序不必要的警告


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值