我正在代码中使用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);
}
任何对此的帮助将不胜感激。
答案 0 :(得分:3)
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);
}
答案 1 :(得分: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);
}
答案 2 :(得分:1)
Quoting the man page for _exit()
_Exit()
和_exit()
函数不得调用在atexit()
中注册的函数或任何已注册的信号处理程序。实现定义是清除打开的流还是关闭流,还是删除临时文件。最后,呼叫过程终止,并产生以下后果。
所以您所看到的是预期的行为。
也就是说,您应该包括unistd.h
(对于_exit()
)和stdlib.h
(对于atexit()
)标头,以包括原型。
如果要调用atexit()
注册的功能,则应改为调用exit()
。
exit()
函数应首先按照其注册的相反顺序调用atexit()
注册的所有函数[....]