C语言中exit()与return的区别
1、exit函数和return函数的主要区别是:
1)exit用于在程序运行的过程中随时结束程序,exit的参数是返回给OS的。main函数结束时也会隐式地调用exit函数。exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流、关闭所有打开的流并且关闭通过标准I/O函数tmpfile()创建的临时文件。exit是结束一个进程,它将删除进程使用的内存空间,同时把错误信息返回父进程;而return是返回函数值并退出函数。通常情况:exit(0)表示程序正常,
exit(1)和exit(-1)表示程序异常退出,exit(2)表示表示系统找不到指定的文件。在整个程序中,只要调用exit就结束(当前进程或者在main时候为整个程序)。
2)return是语言级别的,它表示了调用堆栈的返回;return( )是当前函数返回,当然如果是在主函数main,
自然也就结束当前进程了,如果不是,那就是退回上一层调用。在多个进程时。如果有时要检测上个进程是否正常退出。就要用到上个进程的返回值,依次类推。而exit是系统调用级别的,它表示了一个进程的结束。
3)exit函数是退出应用程序,并将应用程序的一个状态返回给OS,这个状态标识了应用程序的一些运行信息。
4)和机器和操作系统有关的一般是: 0为正常退出,非0为非正常退出;
2、进程环境与进程控制
exit(int n)其实就是直接退出程序,因为默认的标准程序入口为 int main(int argc, char** argv),返回值是int型的。一般在shell下面,运行一个程序,然后使用命令echo
$?就能得到该程序的返回值,也就是退出值,在main()里面,你可以用return n,也能够直接用exit(n)来做。unix默认的正确退出是返回0,错误返回非0。理论上exit可以返回小于256的任何整数。返回的不同数值主要是给调用者作不同处理的。
单独的进程是返回给操作系统的。如果是多进程,是返回给父进程的。父进程里面调用waitpid()等函数得到子进程退出的状态,以便作不同处理。根据相应的返回值来让调用者作出相应的处理。总的说来,exit()就是当前进程把控制权返回给调用该程序的程序,括号里的是返回值,告诉调用程序该程序的运行状态。
1)进程的开始:
C程序是从main函数开始执行,原型如下:int
main(int argc, char *argv[]);通常main的返回值是int型,正确返回0。如果main的返回值为void,某些编译器会给出警告,此时main的返回值通常是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;
}
运行结果:
$
./a.out
main
is done
first
exit handler
first
exit handler
second
exit handler
注意上面的结果,可以发现这些函数由exit按登记相反的顺序自动调用(先myexit1后myexit2)。如果同一函数登记多次, 也会被调用多次(如这里的myexit1)。程序退出的时候利用atexit函数调用了这些处理函数。但是如果用_exit()退出程序,则它不关闭任何文件,不清除任何缓冲器、也不调用任何终止函数!
C语言中exit()与return的区别的更多相关文章
- 面试题----C语言中exit和return的区别
C语言中return和exit的区别 exit用于结束进程,返回的状态码是给操作系统使用或父进程使用的.return是堆栈返回,返回的值是给主调函数用的.主线程结束前会默认调用exit结束进程. ex ...
- (转)C语言中Exit函数的使用
C语言中Exit函数的使用 exit() 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束return() 是当前函数返回,当然如果是在主函数main, 自然也就结束当前进程了,如 ...
- 浅谈Java语言中ArrayList和HashSet的区别
Java语言中ArrayList和HashSet的区别 2019-04-10 13:22:49 一.基本区别 首先一起看个实例,其代码如下: package com.MrZ_baby.com; i ...
- break、continue、exit、return的区别和对比
break.continue.exit.return的区别和对比 一:说明 break.continue在条件循环语句及循环语句(for.while.if等)中用于控制程序的走向:而exit则用于种植 ...
- Linux编程中的坑——C++中exit和return的区别
今天遇到一个坑,折腾了一天才把这个坑填上,情况是这样的: 写了段代码,在main()函数中创建一个分离线程,结果这个线程什么都没干就直接挂掉了,代码长这样: int main() { 创建一个分离线程 ...
- Go语言中的byte和rune区别、对比
Go语言中byte和rune实质上就是uint8和int32类型.byte用来强调数据是raw data,而不是数字:而rune用来表示Unicode的code point.参考规范: uint8 t ...
- Go语言中new和make的区别
Go语言中new跟make是内置函数,主要用来创建分配类型内存. new( ) new(T)创建一个没有任何数据的类型为T的实例,并返回该实例的指针: 源码解析 func new func new(T ...
- C语言中exit函数的使用
exit() 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束 return() 是当前函数返回,当然如果是在主函数main, 自然也就结束当前进程了,如果不是,那就是退回上一 ...
- PHP中die()、exit()、return的区别
1.die()是exit()的别名函数,用法与exit()完全相同,php手册上的说法是,“使用这种别名通常不是个好主意,因为这种别名可能会被完全废弃或更名,导致脚本难以移植到新版本的 PHP 上.” ...
随机推荐
- is_numeric漏洞分析
2014年,PHP中is_numeric函数十六进制绕过漏洞引发了一次安全问题 接下来,我们来分析一下这个漏洞的原理 函数介绍: is_numeric — 检测变量是否为数字或数字字符串. 函数原型: ...
- 安卓Intent(隐式)
相对于显式Intent(明确指出了目标组件名称的Intent),隐式Intent,没有明确指出目标组件名称.显式Intent直接用组件的名称定义目标组件,这种方式很直接.但是由于开发人员往往并不清楚别 ...
- Visual Studio 2013 RTM 中文语言包官方下载地址发布
如果你下载的是英文版,你想安装一个中文的visual studio 2013,那么你大可不必重新下载安装visual studio 2013,因为微软提供了Visual Studio 2013 RTM ...
- [JS] JavascriptHelp (转载)
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Secu ...
- listview中button抢占焦点问题
解决办法Item xml 根节点添加 android:descendantFocusability="blocksDescendants" Button 设置 android:fo ...
- Javascript基础学习(3)_对象和数组
一.对象是一种无序的属性集合,每个属性都有自己的名字和值. 1.创建对象 花括号内逗号分隔 var person = { "Name" : "LiCheng", ...
- 在 Mac OS X 中建立加密的 Zip 压缩 -- 让机密资料加上密码
在 Mac OS X 中要压缩档案的話,基本上就用滑鼠点右鍵选「压缩...」就可以制作 Zip 格式的压缩档,很方便.但如果是机密的资料要透过 Email 等管道传送时,常常会需要建立加密的 Zip ...
- STUN/TURN/ICE协议在P2P SIP中的应用(二)
1 说明 2 打洞和穿越的概念... 1 3 P2P中的打洞和穿越... 2 4 使用STUN系列 协议穿越的特点... 2 5 STUN/ ...
- hibernate一些方法
session.flush() 同步缓存与数据库数据 session.evict(obj) 关闭指定对象缓存 session.clear() 关闭所有缓存 iterator(会把数据放入缓存) 下次 ...
- 算法专题训练 搜索a-T3 Ni骑士(ni)
搞了半天八数码弄不出来就只好来打题解 这道题是在搜索a碰到的(链接: http://pan.baidu.com/s/1jG9rQsQ ) 感觉题目最大亮点就是这英文简写"ni", ...