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

How can I use atexit() function to cleanup function call?

我在我的代码中使用 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);
}

如有任何帮助,我们将不胜感激。

atexit() 函数的这种行为是由于使用了函数 _exit()。此函数不调用 clean-up 函数,如 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);
}

_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);
}

Quoting the man page for _exit()

The _Exit() and _exit() functions shall not call functions registered with atexit() nor any registered signal handlers. Whether open streams are flushed or closed, or temporary files are removed is implementation-defined. Finally, the calling process is terminated with the consequences described below.

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

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

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

The exit() function shall first call all functions registered by atexit(), in the reverse order of their registration, [....]