参考: 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

最新文章

  1. HBase Shell操作
  2. MD5编码的内存泄露
  3. JavaScript学习05 定时器
  4. 创建Maven项目
  5. 图形界面报错“已拒绝X11转移申请”的解决方法
  6. jQuery 监控键盘一段时间内没输入
  7. http://www.jobui.com/mianshiti/it/java/6782/
  8. trash目录: ~/.local/share/Trash
  9. MCS-51单片机实用子程序库
  10. python绝技 — 嗅探FTP登录口令
  11. 使用IntelliJ IDEA 和 Maven创建Java Web项目
  12. iframe 父页面调用子页面的vue方法
  13. 【Spark篇】--Spark中Standalone的两种提交模式
  14. MySQL高级特性——绑定变量
  15. linux下rocksdb的编译安装
  16. &lt;---------------------装箱,拆箱的过程--------------------------&gt;
  17. ubuntu关闭服务需要身份验证
  18. 转:SpringMVC中日期格式的转换
  19. liferay常用api总结
  20. ORTP编译为静态库的问题

热门文章

  1. 前端用vue怎么接收并导出文件
  2. 面向嵌入式的JavaScript引擎
  3. 《神经网络的梯度推导与代码验证》之vanilla RNN的前向传播和反向梯度推导
  4. 【Go语言入门系列】(九)写这些就是为了搞懂怎么用接口
  5. 异步(async)编程
  6. 自定义线程池ThreadPoolExecutor
  7. C# 调用SendMessage刷新任务栏图标(强制结束时图标未消失)
  8. jmeter连接websocket wss
  9. npm 报错 cb.apply is not a function
  10. sql注入--bool盲注,时间盲注