C/C++ 中 exit() 函数
参考: https://blog.csdn.net/jjjcainiao/article/details/21935795
知乎上的问题】C/C++ 中 exit() 函数的参数到底有什么意义?
C 语言的设计之初就是为 Unix 系统设计的,而这个系统是『很多程序互相配合』搭配成一个系统。每个运行着的程序都是进程,而进程就会有父进程,父进程通常是直接启动你的进程,父进程死亡的进程会被 init 收养,其父进程变为 init,而 init 的父进程是进程 0,进程 0 则是系统启动时启动的第一个进程。exit() 里面的参数,是传递给其父进程的。对父进程来说,你的进程仿佛是一个函数,而函数可以有返回值。所以回答第一个问题:exit() 的参数,是给自己的父进程使用的。通常一个程序的父进程可能是任何进程,因此我们无法预期我们的父进程是否规定必须要有这个返回值,那么我们应当提供这个返回值,以保证不同的父进程的需求得到满足。一个典型的例子是 make,Makefile 对于一个 target 下面有多条顺序执行的语句,而 make 作为父进程,会检查每个语句的返回值是否为 0 ,遇到任何一个非 0 值,都会停止当前 rule 的执行。而我们知道,make 实际上可以执行任何命令任何程序,因而任何被 make 调用的程序必须有正确的返回值。另外一个问题,为什么要使用 exit() 函数?答:是历史原因,虽然现在大多数平台下,直接在 main() 函数里面 return 可以退出程序。但是在某些平台下,在 main() 函数里面 return 会导致程序永远不退出(因为代码已经执行完毕,程序却还没有收到要退出的指令)。换句话说,为了兼容性考虑,在特定的平台下,程序最后一行必须使用 exit() 才能正常退出,这是 exit() 存在的重要价值。
【转自specialping】
C语言中Exit函数的使用 exit() 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束 return() 是当前函数返回,当然如果是在主函数main, 自然也就结束当前进程了,如果不是,那就是退回上一层调用。在多个进程时.如果有时要检测上进程是否正常退出的.就要用到上个进程的返回值.. exit(1)表示进程正常退出. 返回 1;exit(0)表示进程非正常退出. 返回 0.进程环境与进程控制(1): 进程的开始与终止 1. 进程的开始:C程序是从main函数开始执行, 原型如下:int main(int argc, char *argv[]);通常main的返回值是int型, 正确返回0. 如果main的返回值为void或者无, 某些编译器会给出警告, 此时main的返回值通常是0.关于main的命令行参数不做过多解释, 以下面的程序展示一下:#i nclude <stdio.h>int main(int argc, char *argv[]){int i;for (i = 0; i < argc; i++)printf("argv[%d]: %s\n", i, argv[i]);return 0;}2. 进程终止:C程序的终止分为两种: 正常终止和异常终止.正常终止分为: return, exit, _exit, _Exit, pthreade_exit异常中指分为: abort, SIGNAL, 线程响应取消主要说一下正常终止的前4种, 即exit系列函数.#i nclude <stdlib.h> /* ISO C */void exit(int status);void _Exit(int status);#i nclude <unistd.h> /* POSIX */void _exit(int status);以上3个函数的区别是:exit()(或return 0)会调用终止处理程序和用户空间的标准I/O清理程序(如fclose), _exit和_Exit不调用而直接由内核接管进行清理.因此, 在main函数中exit(0)等价于return 0.3. atexit终止处理程序:ISO C规定, 一个进程最对可登记32个终止处理函数, 这些函数由exit按登记相反的顺序自动调用. 如果同一函数登记多次, 也会被调用多次.原型如下:#i nclude <stdlib.h>int atexit(void (*func)(void));其中参数是一个函数指针, 指向终止处理函数, 该函数无参无返回值.以下面的程序为例:
#i nclude <stdlib.h>static void myexit1(){printf("first exit handler\n");}static void myexit2(){printf("second exit handler\n");}int main(){if (atexit(my_exit2) != 0)printf("can't register my_exit2\n");if (atexit(my_exit1) != 0)printf("can't register my_exit1\n");if (atexit(my_exit1) != 0)printf("can't register my_exit1\n");printf("main is done\n");return 0;}运行结果:$ ./a.outmain is donefirst exit handlerfirst exit handlersecond exit handler运行结果:$./a.out arg1 arg2 arg3argv[0]: ./a.outargv[1]: arg1argv[2]: arg2argv[3]: arg3 ———————————————— 版权声明:本文为CSDN博主「杰Tang_fighting」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/jjjcainiao/article/details/21935795
C/C++ 中 exit() 函数的更多相关文章
- 转载:Windows下stdlib.h与glut.h中exit()函数重复定义的解决方案
最近用到 OpenGL的第三方库Glut,碰到了exit()这个函数在stdlib.h与glut.h两个头文件中重复定义的情况,解决方案如下: 打开glut.h,找到exit()函数定义的地方(144 ...
- 程序代码中退出函数exit()与返回函数return ()的区别
程序代码中退出函数exit()与返回函数return ()的区别 exit(0):正常运行程序并退出程序: exit(1):非正常运行导致退出程序: return():返回函数,若在主函数 ...
- Linux中exit与_exit的区别
在exit,_exit的区别 - exit()与_exit()函数的区别(Linux系统中)2012-03-20 15:19:53 分类: LINUX 注:exit()就是退出,传入的参数是程序退出时 ...
- Exit函数
1函数: exit() 函数名: exit() 所在头文件:stdlib.h 功 能: 关闭所有文件,终止正在执行的进程. exit(1)表示异常退出.这个1是返回给操作系统的. exit(x)(x不 ...
- Linux C _exit函数与exit函数的联系与区别
一.联系 1.功能上,_exit和exit函数都是让进程正常退出,即关闭进程所打开的文件描述符,释放已占用内存和其他资源. 二.区别 1._exit函数在头文件unistd.h中声明,而exit在头文 ...
- return和exit函数的区别
在上Linux课的时候,老师提到一句,调用vfork产生的子进程就是为了使用exec族函数来执行其他的代码逻辑. 在子进程退出的时候有两种方式,exit和exec族函数,不能使用return,为什么不 ...
- 进程控制之exit函数
进程有下面5种正常终止方式: (1)在main函数内执行return语句.这等效于调用exit. (2)调用exit函数.此函数有ISO C定义,其操作包括调用各终止处理程序(终止处理程序在调用ate ...
- 《APUE》中的函数整理
第1章 unix基础知识 1. char *strerror(int errnum) 该函数将errnum(就是errno值)映射为一个出错信息字符串,返回该字符串指针.声明在string.h文件中. ...
- (转)解析PHP中ob_start()函数的用法
本篇文章是对PHP中ob_start()函数的用法进行了详细的分析介绍,需要的朋友参考下 ob_start()函数用于打开缓冲区,比如header()函数之前如果就有输出,包括回车/空格/换行 ...
随机推荐
- python爬虫实战---爬取大众点评评论
python爬虫实战—爬取大众点评评论(加密字体) 1.首先打开一个店铺找到评论 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经 ...
- [PyTorch 学习笔记] 4.3 优化器
本章代码: https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson4/optimizer_methods.py https: ...
- python3笔记-读取ini配置文件
在代码中经常会通过ini文件来配置一些常修改的配置.下面通过一个实例来看下如何写入.读取ini配置文件. 需要的配置文件是: [path] back_dir = /Users/abc/PycharmP ...
- html打印后不刷新当前页
这种方法可以在打印的页面中添加样式,新页面跳转打印 doPrint(ids){ var titleHTML=document.getElementById(ids).innerHTML; var Op ...
- 使用代码生成工具快速生成基于ABP框架的Vue+Element的前端界面
世界上唯一不变的东西就是变化,我们通过总结变化的规律,以规律来应付变化,一切事情处理起来事半功倍.我们在开发后端服务代码,前端界面代码的时候,界面都是依照一定的规律进行变化的,我们通过抽取数据库信息, ...
- Linux:apache安装
1.查询是否已安装 rpm -qa httpd 如果已安装,先卸载 发现有依赖包,先把依赖卸载 或者加上--nodeps参数,不考虑依赖,直接卸载 rpm -e --nodeps httpd-2. ...
- python基础:异常捕捉
一.异常 python在程序运行过程中,可能会出现一些错误和异常,导致程序停止运行.我们可以通过捕捉异常,并对异常进行处理,使得程序可以正常运行 异常有很多类型,可以根据类型挨个捕捉.也可统一捕获: ...
- SpringBoot2.0 配置多数据源
一.简述 配置多数据源意思就是在一个项目中使用多个数据库,在项目使用中可以不用手动切换数据库来实现不同数据库的数据获取和更新. 源码地址: https://github.com/hanguilin/b ...
- Spring系列之初识Spring Spring概述
初始Spring 啥是Spring? 下面这个就是Spring Spring当然不是上面那个Spring,Spring之所以命名为Spring是因为这个开源的轻量级的开源框架的出现给软件行业带来了春天 ...
- [LeetCode]42. 接雨水(双指针,DP)
题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下, ...