linux的exit和_exit

进程退出

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

正常退出:

  • 在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的差异可以概括成下面这张图:
1234

在讲述差异之前需要先引入一个函数: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的特点和差异,并举例展示了他们的效果。
好记性不如烂笔头。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值