返回值:
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
的问题:
atexit
什么时候会失败,那么它会返回非零值?请给我这样的演示,谢谢!bye
。那么它是否意味着在调用exit()之前我们无法知道atexit
的返回值?如果是,那么第三个问题:if
表达式?答案 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>