C语言 如何使用 atexit() 函数来清理函数调用



我在代码中使用atexit((函数来清理函数调用,但它不起作用。

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

任何有关这方面的帮助将不胜感激。

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

如:

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

_exit关闭程序而不调用退出方法 进一步阅读。

因此,请使用exit(0);而不是_exit(0);

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

手册页进行_exit()

_Exit()_exit() 函数不得调用向atexit()或任何已注册的信号处理程序注册的函数。是刷新还是关闭打开的流,还是删除临时文件,都是由实现定义的。最后,调用进程终止,后果如下所述。

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新