您的位置 首页 设计

atexit函数和exit函数的了解

工作找完了,老板逼着写各种乱七八糟的本子,偷着写点自己的理解,就当是对自己兴趣爱好的补偿吧。按照ISOC的规定,一个进程可以登记多

作业找完了,老板逼着写各种杂乱无章的簿本,偷着写点自己的了解,就当是对自己兴趣爱好的补偿吧。

依照ISO C的规则,一个进程能够挂号多达32个函数,这些函数将由exit自动调用,一般这32个函数被称为停止处理程序,并调用atexit函数来挂号这些函数。

咱们一般以为C言语的开始函数是main函数,本质上一个程序的发动函数并不一定是main函数,这个能够选用链接器来设置,可是gcc中默许main便是C言语的进口函数,在main函数发动之前,内核会调用一个特别的发动例程,这个发动例程从内核中获得命令行参数值和环境变量值,为调用main函数做好预备,因而对应程序而言main函数并不是开始,可是对应C 言语而言,main函数便是进口地址,其他的链接器协助咱们完结,实践上mian函数的履行是使用了exec函数,这是一个函数族,这也是内核履行一个程序的仅有办法,这在进程操控部分将进行剖析。

记住在面试题中有一道关于在main函数退出之后,是否还能够履行程序的问题,这时候就要使用到前面说到的atexit函数

#include
int atexit(void(*func)(void));

其间,atexit的参数是一个函数地址,当调用此函数时无须传递任何参数,该函数也不能返回值,atexit函数称为停止处理程序注册程序,注册完结今后,当函数停止是exit()函数会自动的调用前面注册的各个函数,可是exit函数调用这些函数的次序于这些函数挂号的次序是相反的,我以为这本质上是参数压栈形成的,参数由于压栈次序而先入后出。一起假如一个函数被屡次挂号,那么该函数也将屡次的履行。

咱们知道exit是在main函数调用完毕今后调用,因而这些函数的履行肯定在main函数之后,这也是上面面试题的解决办法。即选用atexit函数挂号相关的履行函数即可。

在exit函数的介绍中咱们知道,exit()和_exit()以及_Exit()函数的本质区别是是否当即进入内核,_exit()以及_Exit()函数都是在调用后当即进入内核,而不会履行一些整理处理,可是exit()则会履行一些整理处理,这也是为什么会存在atexit()函数的原因,由于exit()函数需求履行整理处理,需求履行一系列的操作,这些停止处理函数实践上便是完结各种所谓的铲除操作的实践履行体。atexit函数的界说也给了程序员一种运用exit履行一些铲除操作的办法,比方有一些程序需求额定的操作,详细的铲除操作能够选用这种办法对特别操作进行铲除等。

#include
#include

void func1(void)
{
printf(“in func1”);
}

void func2(void)
{
printf(“in func2”);
}

void func3(void)
{
printf(“in func3”);
}

int main()
{
atexit(func3);
atexit(func2);
atexit(func1);

printf(“In main”);

return 0;
}

详细的履行成果如下所示:

[gong@Gong-Computer APUE]$ ./atexit
In main
in func1
in func2
in func3

依据exit的履行过此可知,exit首要会调用各个停止处理程序,然后按需屡次调用fclose(),封闭一切翻开流,也便是说exit函数会履行一个规范I/O库的整理封闭操作:对一切翻开的流调用fclose(),这样就会形成一切缓冲的输出数据都被冲刷即写入文件中。

内核使程序履行的仅有办法是调用一个exec函数,进程自愿停止哦的仅有办法是显式或许隐式调用(经过exit函数)_exit()或许_Exit()函数。因而exit函数中本质是对_exit()或许_Exit()函数的封装。exit会先履行自界说的停止处理函数,然后履行I/O库函数整理函数fclose(),这也是为什么能够在停止处理函数中能够持续运用printf之类函数的原因,由于I/O库函数的流目标还没有被铲除,当然能够持续运用。履行完了一切的fclose()今后,能够履行真实意义上的停止函数_exit()或许_Exit()函数。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/sheji/317733.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部