exit、return、_exit、_Exit这几个函数的区别(转载)

 

1 exit 函数和 return 函数的主要区别是:

1 exit 用于在程序运行的过程中随时结束程序, 其参数是返回给 OS 。也可以这么讲: exit 函数是退出应用程序 , 并将应用程序的一个状态返回给 OS ,这个状态标识了应用程序的一些运行信息。

main 函数结束时也会隐式地调用 exit 函数, exit 函数运行时首先会执行由 atexit() 函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流、关闭所有打开的流并且关闭通过标准 I/O 函数 tmpfile() 创建的临时文件。

exit 是系统调用级别的, 它表示了一个进程的结束, 它将删除进程使用的内存空间,同时把错误信息返回父进程。通常情况: exit(0) 表示程序正常 , exit(1) exit(-1) 表示程序异常退出, exit(2) 表示系统找不到指定的文件。

 

2 return 是语言级别的, 它表示了调用堆栈的返回; return 是返回函数值并退出函数,通常 0 为正常退出, 0 为非正常退出,请注意,如果是在主函数 main, 自然也就结束当前进程了( 也就是说,在 main() 里面,你可以用 return n ,也能够直接用 exit(n) 来做 ), 如果不是在 main 函数中,那就是退回上一层调用。 在多个进程时,如果有时要检测上个进程是否正常退出,就要用到上个进程的返回值。

 

2 、进程环境与进程控制

如果 exit(int n) 是在 main 函数里被调用的,那么 exit(int n) 就直接退出程序,并返回一个 int 型的值。一般在 shell 下面,运行一个程序,然后使用命令 echo $? 就能得到该程序的返回值,也就是退出值。 理论上 exit 可以返回小于 256 的任何整数,返回的不同数值主要是给调用者作不同处理的。

对于单独的进程 exit 的返回值是返回给操作系统的, 但如果是多进程,则是返回给父进程的。 父进程里面调用 waitpid() 等函数得到子进程退出的状态,以便作不同处理。根据相应的返回值来让调用者作出相应的处理。

总的说来, exit int n )就是当前进程把其控制权返回给调用该子程序的主程序 , 括号里的是返回值 , 告诉调用程序该程序的运行状态。

1 )进程的开始:

C 程序是从 main 函数开始执行 , 原型如下 : int main(int argc, char *argv[]); 通常 main 的返回值是 int , 正确返回 0

 

2 )进程终止:

C 程序的终止分为两种 : 正常终止和异常终止

正常终止分为 : return, exit, _exit, _Exit, pthreade_exit

异常中指分为 : abort, SIGNAL, 线程响应取消

 

主要说一下正常终止的前 4 , exit 系列函数 .

#include <stdlib.h>  

void exit(int status);

void _Exit(int status);

 

#include <unistd.h>  

void _exit(int status);

以上 3 个函数的区别是 :

exit()( return 0) 调用终止处理程序用户空间的标准 I/O 清理程序 ( fclose), _exit _Exit 不调用而直接由内核接管进行清理 因此 , main 函数中 exit(0) 等价于 return 0.

 

3 atexit 终止处理程序:

ISO C 规定 , 一个进程最多可登记 32 个终止处理函数 , 这些函数由 exit 登记相反的顺序 自动调用。 如果同一函数登记多次 , 也会被调用多次。

原型如下 :

#include <stdlib.h>

int atexit(void (*func)(void));

 

其中参数是一个函数指针 , 指向终止处理函数 , 该函数 无参无返回值 atexit 函数本身成功调用后返回 0

 

以下面的程序为例 :

#include <stdlib.h>

static void myexit1()

{

     printf("first exit handler/n");

}

 

 

static void myexit2()

{

     printf("second exit handler/n");

}

 

 

int main()

{

     atexit(my_exit2)

     atexit(my_exit1)

atexit(my_exit1)

     printf("main is done/n");

     return 0; // 相当于 exit(0)

}

 

 

运行结果 :

$ ./a.out

main is done

first exit handler

first exit handler

second exit handler

 

main 函数结束时也会隐式地调用 exit 函数, exit 函数运行时首先会执行由 atexit() 函数登记的函数,然后会做一些自身的清理工作,同时 刷新所有输出流 关闭所有打开的流 并且 关闭通过标准 I/O 函数 tmpfile() 创建的临时文件

注意上面程序的结果,可以发现这些函数由 exit 按登记相反的顺序自动调用(先 myexit1 myexit2 )。 如果同一函数登记多次 , 也会被调用多次(如这里的 myexit1 )。

而这些处理函数都是在程序退出的时候利用 atexit 函数调用了这些处理函数。但是如果用 _exit() 退出程序,则它不关闭任何文件,不清除任何缓冲器、也不调用任何终止函数!

 

原文出处:http://zqwt.012.blog.163.com/blog/static/1204468420105198615886/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值