如何使用atexit()函数清理函数调用?

时间:2019-05-29 07:16:25

标签: c exit atexit

我正在代码中使用atexit()函数清理函数调用,但无法正常工作。

#include<stdio.h>
void ftn(void)
{
    printf(" Function called --> exit\n");
    return;
}
int main(void)
{
    int x = 0;
    atexit(ftn);
    for(;x<0xffffff;x++);
    _exit(0);
}

任何对此的帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

atexit()函数的这种行为是由于使用了_exit()函数。此函数不会调用atexit()等清理函数。如果需要调用atexit(),则应使用exit()或“ return”代替_exit()。

为:

#include<stdio.h>
void ftn(void)
{
    printf(" Function called --> exit\n");
    return;
}
int main(void)
{
    int x = 0;
    atexit(ftn);
    for(;x<0xffffff;x++);
    exit(0);
}

答案 1 :(得分:2)

_exit关闭程序,而不用调用退出方法Further reading

因此,使用exit(0);代替_exit(0);

#include<stdio.h>
void ftn(void)
{
    printf(" Function called --> exit\n");
    return;
}
int main(void)
{
    int x = 0;
    atexit(ftn);
    for(;x<0xffffff;x++);
    exit(0);
}

答案 2 :(得分:1)

Quoting the man page for _exit()

  

_Exit()_exit()函数不得调用在atexit() 中注册的函数或任何已注册的信号处理程序。实现定义是清除打开的流还是关闭流,还是删除临时文件。最后,呼叫过程终止,并产生以下后果。

所以您所看到的是预期的行为。

也就是说,您应该包括unistd.h(对于_exit())和stdlib.h(对于atexit())标头,以包括原型。

如果要调用atexit()注册的功能,则应改为调用exit()

  

exit()函数应首先按照其注册的相反顺序调用atexit()注册的所有函数[....]