进程退出

退出一个进程有多种方式:

正常退出:

  • 在main函数里return

  • 在进程里面调用exit、_exit

  • 在进程的最后一个子线程调用pthread_exit

异常退出:

  • 被信号(9、15)终止

下面讲一下exit和_exit这两个函数的特点和区别

exit、_exit

这两个函数都可以用来退出进程,释放当前进程的系统资源,并返回进程退出时的状态。

函数原型如下:

#include <unistd.h>
void _exit(int status);
#include <stdlib.h>
void exit(int status);

返回值:它们都不会返回
形参:它们都可以指定退出时的状态,放到status里

差异

exit和_exit的差异可以概括成下面这张图:

在讲述差异之前需要先引入一个函数:atexit。
atexit是一个注册退出处理函数,他有什么用呢?
我们在退出一个进程之前,需要做一些善后工作,比如关闭信号量、取消共享内存的映射、关闭已打开的管道文件等等;atexit就可以帮我们做(处理)这个事情。

从上图可以看出,exit函数在调用exit系统调用退出进程之前会调用退出处理函数,但_exit函数并不会调用,直接退出;这就是第一个差异。

这里需要注意使用atexit注册退出处理函数是按照栈的结构注册的,先进后出。(下面示例会展示效果)

第二个差异就是exit会清理IO缓存,如果缓冲区有数据,他会把数据刷新回设备;而_exit函数不会这么做,缓存数据会直接丢失。

代码示例

下面举例说明exit和_exit的作用。

exit示例如下:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>void fun1(void)
{printf("[%s] is calling...\n", __FUNCTION__);
}void fun2(void)
{printf("[%s] is calling...\n", __FUNCTION__);
}int main(void)
{atexit(fun1);atexit(fun2);printf("hello, kugou");exit(0);
}

运行结果如下:

zzc@zzc-virtual-machine:~/share/example$ ./exit
hello, kugou[fun2] is calling...
[fun1] is calling...

上述结果分析:

  1. 这个程序注册了两个退出处理函数fun1、fun2,由于先进后出,所以退出进程时先调用fun2,再调fun1
  2. 上面的printf函数用来打印一个字符串,并且是全缓冲;你会发现退出进程时,IO缓冲区的数据会被刷新到标准输出设备(显示器)

_exit示例如下:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>void fun1(void)
{printf("[%s] is calling...\n", __FUNCTION__);
}void fun2(void)
{printf("[%s] is calling...\n", __FUNCTION__);
}int main(void)
{atexit(fun1);atexit(fun2);printf("hello, kugou");_exit(0);
}

运行结果如下:

zzc@zzc-virtual-machine:~/share/example$ ./exit
zzc@zzc-virtual-machine:~/share/example$

结果分析:
退出进程时并没有调用退出处理函数,也不会清理IO缓冲区的数据。

总结

本文简单介绍了exit和_exit的特点和差异,并举例展示了他们的效果。
好记性不如烂笔头。

linux的exit和_exit相关推荐

  1. linux中exit()和 _exit()说明

        exit和_exit函数都是用来终止进程的.当程序执行到exit或_exit时,系统无条件的停止剩下所有操作,清除包括PCB在内的各种数据结构,并终止本进程的运行.但是,这两个函数是有区别的. ...

  2. Linux中exit与_exit的区别

    在exit,_exit的区别 - exit()与_exit()函数的区别(Linux系统中)2012-03-20 15:19:53 分类: LINUX 注:exit()就是退出,传入的参数是程序退出时 ...

  3. Linux下Exit和_exit函数说明

    exit和_exit函数都是用来终止进程的.当程序执行到exit或_exit时,系统无条件的停止剩下所有操作,清除包括PCB(进程控制块)在内的各种数据结构,并终止本进程的运行.但是,这两个函数是有区 ...

  4. linux下exit()与_exit()的区别

    void exit(int staus) 函数, 在头文件 #include <stdlib.h> void _exit(int status) 函数,在头文件 #include < ...

  5. Linux环境编程--linux中的perror、exit、_exit、wait 和 waitpid

    perror: #include<stdio.h>        #include<stdlib.h> 定义函数 void perror(const char *s);  pe ...

  6. linux中进程退出函数:exit()和_exit()的区别

    linux中进程退出函数:exit()和_exit()的区别 (1)_exit()执行后立即返回给内核,而exit()要先执行一些清除操作,然后将控制权交给内核. (2)调用_exit函数时,其会关闭 ...

  7. exit()与_exit()函数的区别(Linux系统中)

    注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXI ...

  8. linux系统调用:exit()与_exit()函数详解【转】

    (转自:https://blog.csdn.net/drdairen/article/details/51896141) exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示 ...

  9. linux系统调用:exit()与_exit()函数详解

    exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXIT_ ...

最新文章

  1. 特斯拉再裁员3000多人,马斯克称别无选择
  2. django 入门,快速搭建一个后端接口
  3. datatable修改csv的最后一列
  4. python实验八分支语句_python语句(分支,循环)
  5. javascript学习笔记之document对象、表单及表单元素、脚本化cookie
  6. Size Balanced Tree(节点大小平衡树)
  7. 《软件方法》读书笔记2
  8. 中国2017 Google 开发者大会第二天简单回顾
  9. covar of lognormal variables
  10. Android使用蓝牙录音和播放
  11. 软件系统质量属性可用性-稳定性-可靠性-连续性辨析-架构权衡分析方法
  12. 一个exe可执行程序的生与死
  13. 读书笔记-反省使人成长
  14. 1.3亿元战略投资落地,有赞的盈利拐点到了吗?
  15. [转载] 晓说——第17期:揭秘战争秘闻 朝鲜战争62年祭(下)
  16. 2020微信对话截图生成器,各种截图一键制作!
  17. 如何注册腾讯云个人账号(图文教程)
  18. 怎么样减肥又快又好 达人推荐最有效的减肥方法
  19. WebView-WebView简介
  20. ABB智能定位器TZID-C说明书(中文版)

热门文章

  1. 数据结构单链表的基础操作(C语言)
  2. 快速入门Matlab——求取一元函数最小值和零点
  3. matlab敏感性分析代码,sobol敏感性分析 matlab代码
  4. 胡歌12年后首谈车祸:既然活下来了,就不能白白活着
  5. 计算机在我们的生活中应用,计算机在我们生活中的应用
  6. 在win7安装theano
  7. JavaWeb - SSO单点登录原理之基于CAS(一)
  8. 混合硬盘计算机,解决方法:混合硬盘分区技巧[图形教程]
  9. android手机系统怎么刷机包,安卓手机系统怎么重装刷机
  10. list申请java,java把一个list中的内容添加到另一个list中 FPGA编程问题:有多个.v文件与module,把他们加到......