【问题标题】:How can I use atexit() function to cleanup function call? [duplicate]如何使用 atexit() 函数清理函数调用? [复制]
【发布时间】:2019-10-14 17:42:29
【问题描述】:

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

我们将不胜感激。

【问题讨论】:

  • 你应该在fork之后的子进程中调用_exit,并且你不能调用原始清理代码,因为清理属于父进程。

标签: c exit atexit


【解决方案1】:

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

【讨论】:

    【解决方案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);
    }
    

    【讨论】:

      【解决方案3】:

      Quoting the man page for _exit()

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-12
        • 2018-10-18
        • 1970-01-01
        • 2017-06-10
        • 1970-01-01
        相关资源
        最近更新 更多