Я использую функцию 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(). Эта функция не вызывает функции очистки, такие как 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
закрыть программу, не вызывая при выходе методы дальнейшее чтение.
Таким образом, используйте 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);
}
Цитирование справочной страницы для _exit()
The
_Exit()
and_exit()
functions shall not call functions registered withatexit()
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()
) для включения прототипа.
Если вы хотите, чтобы вызывались функции, зарегистрированные с помощью atexit()
, вместо этого следует вызывать exit()
.
The
exit()
function shall first call all functions registered byatexit()
, in the reverse order of their registration, [....]
В основном вы должны вызывать
_exit
всегда, когда в дочернем процессе послеfork
, и вы не должны вызывать исходный код очистки, потому что очистка принадлежит родителю.