【知乎上的问题】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.out
main is done
first exit handler
first exit handler
second exit handler运行结果:
$./a.out arg1 arg2 arg3
argv[0]: ./a.out
argv[1]: arg1
argv[2]: arg2
argv[3]: arg3

C/C++ 中 exit() 函数相关推荐

  1. c++中exit()函数

    首先介绍一下: exit(0): 正常执行程序并退出程序. exit(1): 非正常执行导致退出程序. 其次介绍: stdlib.h头文件中 定义了两个变量: #define EXIT_SUCCESS ...

  2. c语言exit头文件,exit函数在那个头文件

    c语言 exit的头文件是什么? C语言exit函数的头文件是stdlib.h. exit的声明为 void exit(int value); exit的作用是,退出程序,并将参数value的值返回给 ...

  3. exit函数使用说明

    摘要:本文描述的是Linux手册页(3.73版本)中exit()函数的使用说明,使用exit()函数正常终止一个进程.原文来自:http://www.kernel.org/doc/man-pages/ ...

  4. C++中Exit()与atexit()函数的使用

    来源:http://blog.sina.com.cn/s/blog_5cec5bad0100b0x2.html 一.exit()函数 函数声明:void exit(int state); exit() ...

  5. c语言中阻止程序退出的函数,(转)C语言中Exit函数的使用

    C语言中Exit函数的使用 exit() 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束 return() 是当前函数返回,当然如果是在主函数main, 自然也就结束当前进程了, ...

  6. c语言中exit函数_C ++中的exit()函数

    c语言中exit函数 介绍 (Introduction) Today we'll learn about exit() in C++. We know we can break out of loop ...

  7. matlab中函数中止,matlab中有exit函数吗

    有exit函数 exit函数 所在头文件:stdlib.h(如果是"VC6.0"的话头文件为:windows.h) 功能:关闭所有文件,终止正在执行的进程. exit(1)表示异常 ...

  8. C++ 笔记(34)— C++ exit 函数

    当遇到 main 函数中的 return 语句时,C++ 程序将停止执行.但其他函数结束时,程序并不会停止.程序的控制将返回到函数调用之后的位置.然而,有时候会出现一些非常少见的情况,使得程序有必要在 ...

  9. shell中的函数及脚本调试方法

    1.函数格式 目的:将一些相对对立的代码变成函数,提供可读性和重用性,避免重复编写相同代码. 函数格式: 函数关键字:function可以省略,可不带任何参数; 符号{表示函数体的开始(可在函数名后单 ...

最新文章

  1. 2002: [Hnoi2010]Bounce 弹飞绵羊
  2. linux(4):Linux逻辑卷详解总结
  3. 如鹏网 net高级技术 第二章 委托和事件(复习)
  4. OMG!这1010本书的书名都是什么鬼?
  5. nodejs 使用的一些http网络请求模块
  6. 数据结构c语言程海英上机,数据结构(C语言版)程海英-上机6.doc
  7. 盘点2022年爆火的小程序游戏
  8. AI开发者大会:2020年7月3日和7月4日CSDN重磅举办《百万人学AI》大会议程及其对应视频回放链接
  9. DOOM3源码分析相关文章集合
  10. JVM-内存区域与OOM
  11. 还在担心零基础绘画?这篇文章让你少走弯路!
  12. 【Java】Annotation
  13. python控制机器人走直线_python程序控制NAO机器人行走
  14. 【信号去噪】基于改进的阈值高斯脉冲信号去噪含Matlab源码
  15. 在双曲空间进行细粒度实体分类
  16. 也来分析BloomFilter
  17. 使用cmd命令修改IP地址
  18. [分享]在线的代码片段测试工具 jsbin
  19. CICS(cics路况快速检测系统)
  20. 全国行政区划下载(高德)

热门文章

  1. OpenCV每日函数 几何图像变换模块 (9) resize函数
  2. k8spod资源的基础管理操作
  3. 容器云职业技能大赛 不一样的比赛
  4. 记一次APP去壳破解重新打包
  5. 抛出异常及声明异常 自己定义一个异常
  6. 学完高性能计算后的发展怎么样?
  7. Java集合框架笔记记录 --- 原创@余胜军 但有个人心得
  8. 深度学习领域常用英文表达
  9. nginx日志格式配置
  10. print list Reversely