关于atexit的三个问题

时间:2018-04-13 13:08:26

标签: c++ c exit atexit

返回值:

   The atexit() function returns the value 0 if successful; otherwise, it returns a nonzero value.

示例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void
bye(void)
{
    printf("That was all, folks\n");
}

int
main(void)
{
    long a;
    int i;

    a = sysconf(_SC_ATEXIT_MAX);
    printf("ATEXIT_MAX = %ld\n", a);

    i = atexit(bye);
    if (i != 0) {
        fprintf(stderr, "cannot set exit function\n");
        exit(EXIT_FAILURE);
    }

    exit(EXIT_SUCCESS);
}

我已阅读手册页和StackOverflow问题,但仍然有三个关于atexit的问题:

  1. atexit什么时候会失败,那么它会返回非零值?请给我这样的演示,谢谢!
  2. 我们知道,在调用exit()之前不会调用bye。那么它是否意味着在调用exit()之前我们无法知道atexit的返回值?如果是,那么第三个问题:
  3. 现在已经调用了exit(),如何执行if表达式?

4 个答案:

答案 0 :(得分:2)

  

我们知道,在调用exit()之前不会调用bye。那么这是否意味着在调用exit()之前我们无法知道atexit的返回值?

我不确定我是否能完全按照你的想法行事,但误解似乎只是以下几点:

atexit()报告成功只是意味着“我接受了你给我的任何指针,它指向的功能将在退出时被调用”。这并不意味着您的功能的实际调用将会成功。

因此,

atexit()报告错误意味着:“无论出于何种原因,我无法接受您的指针”。您的运行时环境可能内存不足,无法存储另一个指针或类似的东西。

答案 1 :(得分:1)

atexit函数只是将函数添加到“列表”中。它本身不会调用您传递指针的函数。它也不会等待exit被调用,因为这会使它变得无用。因此,它可以立即返回(带有可能的错误代码),程序继续正常。

如果函数无法添加函数指针,则传递给其内部“列表”(例如,它可能是有限的大小,并且您尝试添加更多),然后它将返回失败。同样,它会立即返回,而不是等待exit来电。

答案 2 :(得分:1)

关于问题1:atexit仅在退出时设置要调用的函数。只要能够设置该函数,它就返回0,无论该函数是否实际被调用过。

这样就回答了问题2和问题3:不,您不需要等待exit()知道atexit的返回,所以评估if也没问题。

答案 3 :(得分:1)

atexit()注册一个在程序退出时调用的函数,但它完成了它的执行并将控制返回给调用上下文,而不等待程序终止。换句话说,如果没有注册传递的函数,它不会暂停程序执行。然后程序将从调用atexit()的地方恢复,并且只有当它因任何原因终止时,才会调用注册的处理程序。

这应该回答你的问题2:atexit()“立即”返回一个值,而不是程序终止。这也应该回答您的问题3:当您致电exit()时未调用atexit(),并且程序流程可以正常继续。

关于第一个问题,atexit()失败的条件取决于特定的libc实现。在这些情况下,将返回负值,errno将包含反映错误条件的代码。例如,在GNU libc中,如果atexit()无法为传递的错误函数分配条目,则返回错误,请参阅由atexit__new_exitfn() source code)内部调用的source code here。 / p>