Можем ли мы отменить регистрацию обработчика выхода, который был зарегистрирован с помощью atexit()?

можно ли отменить регистрацию функции обработчика выхода???

void exit_handler_1()
{
    printf("in first exit handler\n");
}

int main()
{
    if(atexit(exit_handler_1())
    {
        perror("error");
    }
    return 0;
}

person Dark Vampire    schedule 19.04.2014    source источник
comment
Нет, это невозможно.   -  person n. 1.8e9-where's-my-share m.    schedule 19.04.2014
comment
@mata — помечен как C, а не Python   -  person Ed Heal    schedule 19.04.2014


Ответы (3)


Это невозможно.

Почему бы просто не зарегистрировать одну функцию atexit и иметь глобальную переменную для этой функции, чтобы иметь возможность решать, что от нее требуется.

person Ed Heal    schedule 19.04.2014

Вы не можете отменить регистрацию atexit функций, но можете отключить свои собственные функции.

static int disable_my_exit_handler = 0;

void exit_handler_1()
{
    if ( disable_my_exit_handler )
        return;

    printf("in first exit handler\n");
}

int main( void )
{
    if ( atexit( exit_handler_1 ) )
    {
        perror("error");
    }

    disable_my_exit_handler = 1;
    return 0;
}
person user3386109    schedule 19.04.2014

atexit также позволяет регистрировать функцию несколько раз. Чтобы отменить регистрацию функции, несуществующий unregister_atexit должен разрешать не только функцию, но и позицию, с которой вы хотите ее отменить. Это быстро приводит к раскрытию интерфейса стека, используемого для хранения функций, зарегистрированных atexit.

person R Sahu    schedule 19.04.2014